如何在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); 
    }) 
} 
+0

你很喜欢单元测试,但更重要的问题是单元测试是否合理。恕我直言,答案是否定的。没有分支 - 除了错误处理程序。这太简单了,无法在其他任何级别上进行测试,例如只使用浏览器。 – oligofren

+0

感谢您的建议,非常感谢! – makory

+0

@oligofren这是主观的。我不打扰完整地测试视图结构,但可能会断言将“{data:posts}”传递给视图。例如,如果视图中存在某种迭代逻辑,则可以在此处轻松进行测试。 – Drumbeg

我使用磁带而不是摩卡/柴,但我的方法可能会帮助你。

我只是断言,回应包括我期待的文字。

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'));。我不打扰地说,我的整个视图都按预期呈现,只是我传递给渲染调用的任何数据实际上都以响应结束。