单元测试蓝鸟承诺绑定功能

时间:2017-08-10 15:30:21

标签: unit-testing bluebird sinon sinon-chai

我有以下函数使用bind将上下文绑定到then链。当我尝试测试它时,它会抛出

  TypeError: redisClient.hgetallAsync(...).bind is not a function


myFunc() {
    let self = this;

    return redisClient.hgetallAsync('abcde')
      .bind({ api: self })
      .then(doStuff)
      .catch(err => {
        // error
      });
  }

测试

let redisClient = { hgetallAsync: sinon.stub() };

describe('myFunc', () => {
    beforeEach(() => {
      redisCLient.hgetallAsync.resolves('content!');
    });

    it('should do stuff', () => {
      return myFunc()
        .should.eventually.be.rejectedWith('Internal Server Error')
        .and.be.an.instanceOf(Error)
        .and.have.property('statusCode', 500);
    });
  });

1 个答案:

答案 0 :(得分:0)

hgetallAsync存根返回一个普通的JS Promise而不是Bluebird的承诺。

要使用Bluebird承诺,您需要使用Sinon告诉.usingPromise()这样做。

let redisClient = { hgetallAsync: sinon.stub().usingPromise(bluebird.Promise) };

文档链接: http://sinonjs.org/releases/v4.1.2/stubs/#stubusingpromisepromiselibrary