Node.js 柴信农没有抓住拒绝承诺的机会

Node.js 柴信农没有抓住拒绝承诺的机会,node.js,sinon,chai,Node.js,Sinon,Chai,//foo.js const api = require('someApi'); exports.get = obj => { if (!obj.id) { return Promise.reject('no id'); } api.get(obj.id)... } //foo.spec.js let getStub; beforeEach(() => { getStub = sinon.stub(api, 'get'); });

//foo.js

const api = require('someApi');
exports.get = obj => {
  if (!obj.id) {
     return Promise.reject('no id');
  }

  api.get(obj.id)... 
}
//foo.spec.js

 let getStub;

  beforeEach(() => {
    getStub = sinon.stub(api, 'get');
  });

   it('should fail to retrieve location on insufficient data', () => {
    let obj = {};
    foo.get(obj)
      .catch(err => {
        getStub.should.have.not.been.called();
        expect(err).to.not.equal('undefined');
      })

  });
当我执行测试时,我收到以下错误:

(node:73773) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property 'have' of undefined
没有指向该错误的其他堆栈跟踪。就我所见,我已经通过捕获catch块中的错误来处理承诺拒绝


这是一种很好的测试方法吗?我应该如何解决这个问题?

这通常是因为“it”块在catch块捕获异常之前就完成了。您可以添加一个“已完成”呼叫以防止出现这种情况:

it('should fail to retrieve location on insufficient data', (done) => 
{
    let obj = {};
    foo.get(obj)
      .catch(err => {
        getStub.should.have.not.been.called();
        expect(err).to.not.equal('undefined');
        done();
      })
}