javascript - 使用 Sinon 进行单元测试:如何在回调中测试变量?
问题描述
我和Sinon一起做单元测试,至少试图让一些东西通过,但我很不走运。我无法在网上找到任何东西。
我有两个问题:
1)我试图得到一个简单的回应,但它没有说spy
is false
。当我记录它时,它说它是true
.
2)我想在回调函数中测试模板是否等于'New Title'。我无法弄清楚如何将 req、res 和 next 传递到 router.get
路由器.js
const express = require('express'), router = express.Router();
router.get('/', (req, res, next) => {
var template = {
title: req.title,
item: req.item,
description: 'N/A'
};
res.render('index', template);
module.exports = router;
});
router.spec.js
const router = require('./router');
var res = {};
var req = {
title: 'New Title',
item: 'Blank Item'
};
var template = {
title: req.title,
item: req.item,
description: 'N/A'
};
it('1) should call the response', ()=>{
var spy = sinon.spy(route, 'get');
route.get('/', ()=>{});
console.log(spy.calledOnce); // equals true
assert(spy.calledOnce).toBeTruthy();
spy.restore();
});
it('2) should return a status 200', ()=>{
var stub = sinon.stub().yield([req, res, next]);
route.get('/', stub); // main problem
assert.equal(200, res.statusCode);
stub.restore();
});
我想访问路由处理程序,以便进行进一步测试。在这种情况下,我可以在哪里以及如何实现路由处理?
解决方案
用于路由的 Express 应用程序通常最好使用集成测试进行测试,而不是您尝试进行的单元测试。Supertest可以用作库。
我们可以做的另一个改进是将生成模板的逻辑分离到另一个文件中。而对于这个服务,我们可以对其进行单元测试。可以选择使用摩卡或开玩笑。
例子:
const request = require('supertest');
const express = require('express');
const service = require('./service'); // our new service file
const app = express();
app.get('/', function(req, res) {
const template = service.getTemplate(req);
res.render('index', template);
});
// integration test, ideally must be separated into a test file e.g. app-integration-test.js
request(app)
.get('/')
.expect('Content-Type', /json/)
.expect('Content-Length', '15')
.expect(200)
.end(function(err, res) {
if (err) throw err;
});
// service.js
function getTemplate(req, res) {
return {
title: req.title,
item: req.item,
description: 'N/A'
};
}
// service-unit-test.js
describe('service test', function() {
it('returns template correctly', function() {
const req = {
title: 'someone',
item: 'my item',
}
const template = service.getTemplate(req);
expect(template).to.eql({
title: 'someone',
item: 'my item',
description: 'N/A'
})
})
})
希望能帮助到你!
推荐阅读
- typescript - 对具有未知索引类型的对象进行排序
- javascript - 模块构建失败(来自 ./node_modules/sass-loader/lib/loader.js),复合选择器可能不再扩展
- javascript - 如何以编程方式在 chrome 扩展中显示授权标头
- c# - 获取 ASP.NET Core 中的所有服务器变量
- git - (列表)在提交 SHA 的末尾
- django - Django - django.db.utils.OperationalError:没有这样的表:django_session
- c++ - 以下代码 C++ sfml 似乎有错误。我在这里想念什么。谢谢
- google-maps - Google表格中GOOGLEMAPS自定义应用脚本函数的数组输入
- javascript - 有多个触发器时如何更新 gsap 中目标的坐标?
- firebase - 是否可以在创建 firebase 用户之前发送验证电子邮件并验证电子邮件?