我实际上正在创建一个应用程序,我需要进行一些集成测试。
我实际上想知道我应该怎么做才能避免我的快速回调路由的真实行为。
示例:承认我想在快速路线上发布数据并检查我是否收到 HTTP 200 响应代码,但没有真正将对象添加到我的数据库中。
编辑:我正在使用 super 测试(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进入混音或您选择的任何其他模拟库。它可能需要相当多的重构才能注入(inject)模拟组件。
主要思想是模拟用户存储库,它封装了所有与用户数据的数据库通信,并在测试中模拟它。然后您将模拟存储库注入(inject)路由器并使用 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);
}