使用chai和sinon在一个方法中剔除一个承诺

时间:2016-10-12 10:42:20

标签: node.js sinon chai sinon-chai

我的测试功能看起来大致如此;

  function doThing(data, callback) {

    externalService.post('send').request(data)
        .then(() => {
          if (callback) { callback(); }
        })
        .catch((message) => {
          logger.warn('warning message');
          if (callback) { callback(); }
        });
  }

我正在尝试使用Chai和Sinon来测试它。

我尝试过不同的指南,我目前的咒语看起来像;

const thingBeingTested = require('thing-being-tested');
const chai = require('chai');
const sinon = require('sinon');
require('sinon-as-promised');
const sinonChai = require('sinon-chai');
const expect = chai.expect;

var chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);
chai.use(sinonChai);

describe('The Thing', () => {  
  it('should run a callback when requested and successful', done => {

    const externalService = { post: { request: sinon.stub() } };
    const callback = sinon.spy();

    externalService.post.request.resolves(callback);

    doThing({...}, callback);
    expect(callback).to.have.been.called;
    done();
  });
});

我无法正确删除externalService.post。任何帮助将不胜感激。

我对Chai和Sinon来说是全新的 - 所以完全期望做一些愚蠢的事情。

1 个答案:

答案 0 :(得分:1)

您的doThing函数无权访问您的测试const externalService。我假设您的主文件类似于

const externalService = require('./external_service');

得到它。

在您的测试中,您也应该获得相同的externalService

describe(..., () => {
    it(..., () => {
        // adjust the path accordingly
        const externalService = require('./external_service');

然后嘲笑它的方法:

sinon.stub(externalService, 'post').returns({
    request: sinon.stub().resolves(callback)
});

然后您可以致电doThing并分析结果。

测试完成后,请勿忘记恢复原来的post

externalService.post.restore();