使用Nodejs进行集成测试,表达和超级

时间:2015-09-07 06:38:03

标签: javascript node.js integration-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:是否可以制作类似于模拟的东西?就像伪造一个请求?

你知道,如果我发布一些东西,我需要在我的数据库中插入一些内容吗?

我不希望在myintegration测试期间插入任何内容,只需测试结果http响应代码。

我的意思是,承认我有一个类似/client的网址,我在其上发布了一个新客户端。它将在表中创建一个新行。我不希望插入任何行,但我需要测试请求的响应代码。

这可能吗?

2 个答案:

答案 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

相关问题