node.js - 我如何在 Jest 中测试 node.js 模板渲染

标签 node.js express jestjs

这是我的路线之一。

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

问题是我不知道如何测试是否由于渲染函数而返回有效的 actor。

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

如果我这样写

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

我知道如何测试它,因为这个 Actor 会在 body 参数中。比如:

//测试

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

res.body和actor一样

所以问题:

1) 如何测试第一个呈现某些 View 的示例?

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

最佳答案

在单元测试中,你应该模拟你的依赖关系,所以如果你正在测试你的 Controller ,你应该模拟 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();
    });
  });
});

关于node.js - 我如何在 Jest 中测试 node.js 模板渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55612624/

相关文章:

javascript - 集群 Node 应用程序时 Socket.io websocket 授权失败

javascript - 分配变量后对象行为发生变化

javascript - 如何模拟和测试 Axios 拒绝的 promise ?

javascript - 开 Jest - 将测试分开到另一个文件中

react-native - 开 Jest - 从 'setupDevtools' 找不到模块 'setup.js'

node.js - 如何监控Mongoose连接池

node.js - 如何从 Node 正确调用AWS Api Gateway?

javascript - expressjs 无需任何引擎即可渲染 html 文件

Node.js:如何以正确的方式处理 promise 更改

node.js - Socket.io 打开数百个连接