【问题标题】:Integration testing with Nodejs, express and supertest [closed]使用 Nodejs、express 和 supertest 进行集成测试 [关闭]
【发布时间】:2015-09-07 06:38:02
【问题描述】:

我实际上是在创建一个应用程序,我需要进行一些集成测试。

我实际上想知道我应该如何做才能避免我的快速回调路由的实际行为。

示例:承认我想在快速路由上发布数据并检查我是否获得了 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 的网址,然后我在上面发布了一个新客户。它将在表中创建一个新行。我不想插入任何行,但我需要测试请求的响应代码。

这可能吗?

【问题讨论】:

  • 我无法理解您的需求。

标签: javascript node.js integration-testing


【解决方案1】:

我建议将 sinon.js 添加到 mix 或您选择的任何其他模拟库中。为了注入模拟的组件,它可能需要进行相当多的重构。

主要思想是模拟用户存储库,该存储库封装了与用户数据的所有数据库通信,并在测试中模拟它。然后,您将模拟存储库注入路由器并使用 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);
}

【讨论】:

    【解决方案2】:

    您可以使用 nock 模块。它使用简单,您可以获取任何您想要的数据并进行测试。

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

    在 supertest 中,您可以测试 'id' 值。对于错误情况,您可以使用 replyWithError。您可以在此处获取更多详细信息:https://www.npmjs.com/package/nock

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 2020-02-15
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多