我很难理解如何对提交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')行上失败了,我真的不希望这行执行我想以某种方式嘲笑它?
我想我错过了一些明显的东西!
谢谢大家 乔伊
答案 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中调用了你的快速实例应用程序。