这是我的路线之一。
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 ,你应该模拟 req
和 res
对象以及模型。例如
实现
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/