我正在创建一个应用程序,我需要做一些集成测试。
我实际上在想我该怎么做才能避免我的快速回呼路线的实际行为。
示例:承认我想在快递路线上发布数据,并检查我是否得到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:有可能做一些像模拟吗?比如伪造请求?
你知道,如果我发布一些东西,我需要在数据库中插入一些东西,对吗?
我不想在集成测试中插入任何东西,只测试结果http响应代码。
我的意思是,承认我有一个像/client
这样的url,我在上面发布了一个新的客户端。它将在表中创建一个新行。我不想插入任何行,但我需要测试请求的响应代码。
这可能吗?
我建议将sinon.js添加到您选择的任何其他mock库中。为了注入模拟的组件,可能需要进行相当多的重构。
主要思想是模拟用户存储库,它封装了所有数据库与用户数据的通信,并在测试中模拟它。然后将模拟的仓库注入路由器,并使用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);
}
您可以使用nock模块。它使用简单,你可以得到任何你想要的数据,你可以测试它。
Ex: nock('http://example.com')
.get('/users')
.query(true)
.reply({results: [{id: 'pgte'}]});
在supertest中你可以测试'id'的值。对于错误情况,你可以使用replyWithError。您可以在这里获得更多详细信息:https://www.npmjs.com/package/nock