如何在Express中对渲染视图进行单元测试?
问题描述:
我的控制器查询我已经测试过的另一台服务器上的API,并且它可以正常工作。我很好奇我将如何去测试这个控制器,它所做的就是获取api数据并渲染它。我已经测试并验证过我的api和chai-http一起工作,所以如何正确地测试这个单元呢?如何在Express中对渲染视图进行单元测试?
function(req, res){
rp(http://www.foobar.com/api/posts)
.then(function(posts){
res.render('view', { data : posts });
})
.catch(function(err){
next(err);
})
}
答
我使用磁带而不是摩卡/柴,但我的方法可能会帮助你。
我只是断言,回应包括我期待的文字。
test('Post /auth/login renders an error raised by the api service', (t) => {
let spy = sinon.spy();
let mock = sinon.stub(api, 'doLogin')
.resolves({dataForView: 'great success'});
request(app)
.post('/auth/login')
.expect(200)
.end((err, res) => {
t.ok(res.text.includes('great success'));
t.end();
mock.restore();
});
});
关键部分是t.ok(res.text.includes('great success'));
。我不打扰地说,我的整个视图都按预期呈现,只是我传递给渲染调用的任何数据实际上都以响应结束。
你很喜欢单元测试,但更重要的问题是单元测试是否合理。恕我直言,答案是否定的。没有分支 - 除了错误处理程序。这太简单了,无法在其他任何级别上进行测试,例如只使用浏览器。 – oligofren
感谢您的建议,非常感谢! – makory
@oligofren这是主观的。我不打扰完整地测试视图结构,但可能会断言将“{data:posts}”传递给视图。例如,如果视图中存在某种迭代逻辑,则可以在此处轻松进行测试。 – Drumbeg