我实际上正在创建一个应用程序,我需要进行一些集成测试。
我实际上想知道如何避免我的快速回叫路线的真实行为。
示例:承认我想在快速路由上发布数据并检查我是否收到了HTTP 200响应代码,但没有真正将对象添加到我的数据库中。
编辑:我正在使用supertest(https://github.com/visionmedia/supertest)
我该怎么办?
request
.post('/users')
.send({
message : JSON.stringify({
date: Math.round((new Date()).getTime() / 1000),
type_fiche: 'test',
id_fiche: 123
})
})
.expect(200)
.end(done);
});
编辑2:是否可以制作类似于模拟的东西?就像伪造一个请求?
你知道,如果我发布一些东西,我需要在我的数据库中插入一些内容吗?
我不希望在myintegration测试期间插入任何内容,只需测试结果http响应代码。
我的意思是,承认我有一个类似/client
的网址,我在其上发布了一个新客户端。它将在表中创建一个新行。我不希望插入任何行,但我需要测试请求的响应代码。
这可能吗?
答案 0 :(得分:1)
我建议将sinon.js添加到您选择的混音或任何其他模拟库中。为了注入模拟组件,可能需要进行相当多的重构。
主要思想是模拟用户存储库,它将所有数据库通信封装在用户数据中并在测试中进行模拟。然后,您将使用supertest将模拟的存储库注入路由器并测试Express应用程序。查看为GET请求测试虚构用户API的示例。
var routerFactory = require('../path/to/router/factory');
describe('app router', function () {
var app, repository, router;
beforeEach(function () {
app = require('express')();
repository = createFakeUserRepository();
router = createRotuter(repository);
});
describe('getting user by id', function () {
beforeEach(function () {
app.use('/test'm router);
testedApp = supertest(app);
});
describe('GET /user/id', function (){
beforeEach('setup for valid response', function () {
repository.getById.returns(Promise.resolve({ expected: 'valid response' }))
})
it('returns 200', function (done){
testedApp.get('/test/user/id')
.expect(200, JSON.stringify({expected: 'valid response'}), done);
})
})
})
})
})
function createFakeUserRepository() {
return {
getById(): sinon:stub()
save(): sinon:stub()
};
}
function createRouter(fakeUserRepository) {
return routerFactory(fakeUserRepository);
}
答案 1 :(得分:1)
您可以使用nock模块。它易于使用,你可以获得你想要的任何数据,你可以测试它。
Ex: nock('http://example.com')
.get('/users')
.query(true)
.reply({results: [{id: 'pgte'}]});
在supertest内部,您可以测试'id'值。对于错误情况,您可以使用replyWithError。您可以在此处获取更多详细信息:https://www.npmjs.com/package/nock