单元测试表达路由回调 - 模拟res对象

时间:2018-02-21 17:09:36

标签: javascript node.js unit-testing express mocha

我很难理解如何对提交html文件的简单快速获取请求进行单元测试。

在我的设置中,当我收到有关未设置视图引擎的错误时,我运行我的代码时。

我想要做的只是检查' res.render'已经调用了函数并对其进行了模拟,因此它实际上并没有做它应该做的事情。

route.js

module.exports = function(router) {

    router.get('/test', function(req, res, next) {
        console.log("Hi");
        res.render('test/test', { current: "current"});
    });
};

test.js

const request = require('supertest');
const sinon = require('sinon');
const express = require('express');
const app = express();
const routes = require('../../routes/route')(app);
describe('My routes', function () {

    before(function() {
        return this.spy = sinon.spy(app, 'render');
    });

    after(function() {
        return this.spy.restore();
    });

    it('should render to /test', function(done) {

        var res = { render: sinon.spy() };

        request(app)
            .get('/test')
            .expect(200, done)
    });
});

它在res.render(' test / test')行上失败了,我真的不希望这行执行我想以某种方式嘲笑它?

我想我错过了一些明显的东西!

谢谢大家 乔伊

2 个答案:

答案 0 :(得分:0)

您收到此错误的原因应该是明确的,因为您在尝试运行view engine方法时没有在Express应用程序上设置render()

从模板引擎上的Express文档中(显然用您在应用程序中使用的引擎替换下面的内容):

app.set('views', './views') // specify the views directory
app.set('view engine', 'ntl') // register the template engine

至于模拟渲染方法,您可能需要查看https://github.com/danawoodman/sinon-express-mock来模拟Express中的请求和响应对象。即使您不想使用该软件包,也可以查看源代码,看看它们是如何进行的,以及它是否符合您想要完成的任务。

答案 1 :(得分:0)

问题在于,您应该创建一个全新的快速应用程序,而不是“要求”在您的实际代码中使用其他地方的现有应用程序。你的路线住在那个真正的快递应用程序中,所以到达它们的唯一方法是测试真正的快递应用程序。在您当前的设置中,即使您通过设置所有需要的属性来解决错误,您仍然需要复制您在真正的快速应用程序中放置的所有内容。

从test.js中删除

const express = require('express');
const app = express();

上面的代码创建了一个空的应用程序,而不是您想要测试的内容。

将其替换为

 const app = require('../../../app').app //customize for your file system

上面的代码是一个示例,但想法是您的const app测试需要指向实际应用程序中的express实例。因此,如果您的主应用程序文件是server.js,并且它的测试文件中有3级,那么在您的路由测试中,您需要使用

const app = require('../../../server.js).app 

假设你在server.js中调用了你的快速实例应用程序。