在Jest中如何测试Node.js模板渲染

3
这是我的其中一条路线。
const actor = await Actor.findById(req.params.id);
if(!actor) throw new Error("Actor not found");
res.render('admin/actors/edit_actor',{actor:actor});

事情是我不知道如何测试有效的演员是否因渲染函数而返回。

================================================================

如果我写以下内容

const actor = await Actor.findById(req.params.id);
    if(!actor) throw new Error("Actor not found");
    res.send({actor:actor});

我知道如何测试这个,因为这个演员将在body参数中出现。例如:

//测试

const res = await request(server).get('/actor/2');

res.body与actor相同

所以问题是:

1)我如何测试渲染某个视图的第一个示例?

2)对于第一个示例,需要编写集成测试。对于第二个示例,我们应该编写功能测试。我是正确的吗?

1个回答

1

在单元测试中,您应该模拟您的依赖项,因此如果您正在测试控制器,则应该模拟reqres对象以及模型。例如

实现

import Actor from '../model/Actor';

const controller = (req, res) => {
  const actor = await Actor.findById(req.params.id);
  if(!actor) throw new Error("Actor not found");
  res.render('admin/actors/edit_actor',{actor:actor});
}

单元测试

import Actor from '../model/Actor';

jest.mock('../model/Actor');

describe('controller', () => {
  const req = {
    params: { id: 101 }
  };

  const res. = {
    render: jest.fn()
  };

  beforeAll(() => {
    Actor.findById.mockClear();
    controller(req, res);
  });

  describe('returning an actor', () => {
    beforeAll(() => {
      res.render.mockClear();
      Actor.findById.mockResolvedValue({
        name: "Some Actor"
      });
      controller(req, res);
    });

    it('should get actor by id', () => {
      expect(Actor.findById).toHaveBeenCalledWith(101);
    });

    it('should call res.render', () => {
      expect(res.render).toHaveBeenCalledWith('admin/actors/edit_actor', { actor });
    })
  });

  describe('not returning an actor', () => {
    beforeAll(() => {
      res.render.mockClear();
      Actor.findById.mockResolvedValue(undefined);
      controller(req, res);
    });
    it('should throw an Error', () => {
      expect(() => controller(req, res)).toThrow(Error);
    });

    it('should not call res.render', () => {
      expect(res.render).not.toHaveBeenCalled();
    });
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接