如何使用带有Express js单元测试的sinon js

时间:2016-09-28 12:22:35

标签: node.js unit-testing express sinon sinon-chai

您好我想对我的快递js代码进行单元测试我想模拟数据所以在搜索多个网站和博客后我找到了this库但我不清楚如何使用这个库进行模拟或数据。 我的测试代码是

var request = require('supertest');
var server = require('./app');
var chai = require('chai');
var chaiHttp = require('chai-http');

var server = require('./app');

var should = chai.should();
chai.use(chaiHttp);

describe('loading express', function () {

  it('responds to /', function testSlash(done) {
    request(server)
      .get('/')
      .expect(200, done);
  });

  it('404 everything else', function testPath(done) {
    request(server)
      .get('/foo/bar')
      .expect(404, done);
  });

  it('responds to /customers/getCustomerData', function testPath(done) {
    request(server)
      .get('/customers/getCustomerData?id=0987654321')
      .end(function(err, res){
        res.should.have.status(200);
        res.body.should.be.a('object');
        res.body.status.should.equal("success");
        res.body.data.customerId.should.equal("0987654321");

        done();
      });
  });

});

目前这段代码是从数据库中获取数据,但我想使用模拟数据进行单元测试。我怎样才能做到这一点?

__ EDIT __

我想测试Express js routes文件中写的代码。这条路线我在 app.js 文件中调用这个

var customers = require('./routes/customers');
app.use('/customers', customers);

现在客户路由文件包含的代码是

function getCustomerData(req, res, next) {
    var response = {};
    var cb = function (response) {
        res.send(response);
    }
    var modelObj = req.models.customer_master;
    var data = req.query;
    controllers.customers.get(modelObj, data, cb);
};
router.get('/getCustomerData', function (req, res, next) {
    getCustomerData(req, res, next);
});

我想测试" get"的响应使用模拟数据的方法

3 个答案:

答案 0 :(得分:2)

我想你想要控制中间件。由于您没有提供任何服务器端代码,我只是假设一些事情:

app.get('/', rootController.get);

现在你想要存根这个控制器:

it('responds to /', function testSlash(done) {
  const rootController = require('./path/to/your/controller');
  const rootControllerStub = sinon.stub(rootController, "get",
    function(req, res, next){
      res.status(200).json({stubbed: 'data'});
    });
  request(server)
    .get('/')
    .expect(200)
    .expect({stubbed: 'data'})
    .end(done);
});

答案 1 :(得分:0)

如果你想模仿,可以使用sinon express mocks here,或者如果你想测试实际的响应数据,JSON,请使用example

示例中的express路由接受一个参数并返回JSON

it('should respond with JSON data', function (done) {
  request(server)
    .get('/about/jv')
    .expect(200)
    .end(function (err, response) {
      assert.equal(response.header['content-type'], 'application/json; charset=utf-8');
      assert.deepEqual(response.body, {
        "data":{
        "username":"hellojv"}
      });
      done();
    });

但如上所述,如果你想使用sinon,那么使用模拟库。该示例使用Mocha和supertest。

答案 2 :(得分:0)

此外,如果编写许多测试文件,则存根可能由于缓存而无法工作。我必须在初始化存根和服务器之前清除缓存。顺序也很重要。

// have to clear every module which belongs to the require chain
// APP require FOO ROUTE require FOO CONTROLLER require BAR LIB
const caches = [
    '../app',
    '../routes/foo',
    '../controller/foo',
];
caches.forEach(cache => {
    delete require.cache[require.resolve(cache)];
});
// mock
const bar = require('../lib/bar');
sinon.stub(bar, 'bar').callsFake(async function() {
    return null;
});
app = require('../app');

// ... then the test ...

我发现this thread有帮助。