javascript - 使用 Nodejs、express 和 supertest 进行集成测试

标签 javascript node.js integration-testing

<分区>

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

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

示例:承认我想在快速路线上发布数据并检查我是否收到 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);
}

关于javascript - 使用 Nodejs、express 和 supertest 进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32432481/

相关文章:

javascript - 服务工作人员错误。无法在实时 (https) 服务器上工作

c# - 在同一解决方案中针对服务器运行集成测试

php - 如何使表单字段成为必填项

javascript - 在 Firebase onWrite 中删除云函数中的当前节点

javascript - 通过 ReactDOM 渲染多个组件

javascript - 带有 require 的 Node.js ES6 类

javascript - 使用 NightwatchJS 将焦点更改为父元素

node.js - 与 MongoDB 而不是 Redis 一起使用的 Kue 有什么好的替代品?

php - 需要执行composer和npm的WordPress插件的集成测试

spring - 如何在没有继承的情况下在我的测试中共享 @MockBeans 和模拟方法?