使用Nodejs进行集成testing,express和supertest

我实际上正在创build一个应用程序,我需要做一些集成testing。

我真的想知道我该怎么做,以避免我的特快回拨路线的真实行为。

例如:承认我想在快速路由上发布数据,并检查是否收到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:是否有可能做一个像模拟的东西? 像伪造一个请求?

你知道,如果我发布的东西,这是我需要在我的数据库中插入的东西吗?

我不想在我的集成testing中插入任何东西,只是testing结果http响应代码。

我的意思是,承认我有一个像/client的url,我发布了一个新的客户端。 它将在表中创build一个新的行。 我不想要插入任何行,但我需要testing请求的响应代码。

那可能吗?

我build议将sinon.js添加到您select的混音或任何其他嘲笑库中。 它可能需要相当多的重构才能注入模拟的组件。

主要思想是模拟用户资源库,它封装了所有与用户数据的数据库通信,并在testing中模拟它。 然后你将注入嘲弄的资源库到路由器和超级testing快速应用程序。 查看GET请求的虚拟用户APItesting示例。

 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模块。 它的使用简单,你可以得到任何你想要的数据,你可以testing它。

 Ex: nock('http://example.com') .get('/users') .query(true) .reply({results: [{id: 'pgte'}]}); 

在supertest里面你可以testing'id'的值。 对于错误情况,您可以使用replyWithError。 你可以在这里获得更多的细节: https : //www.npmjs.com/package/nock