首页 文章

测试在Mocha / Chai中拒绝了承诺

提问于
浏览
11

我有一个拒绝承诺的课程:

Sync.prototype.doCall = function(verb, method, data) {
  var self = this;

  self.client = P.promisifyAll(new Client());

  var res = this.queue.then(function() {
    return self.client.callAsync(verb, method, data)
      .then(function(res) {
        return;
      })
      .catch(function(err) {    
        // This is what gets called in my test    
        return P.reject('Boo');
      });
  });

  this.queue = res.delay(this.options.throttle * 1000);
  return res;
};

Sync.prototype.sendNote = function(data) {
  var self = this;
  return self.doCall('POST', '/Invoice', {
    Invoice: data
  }).then(function(res) {
    return data;
  });
};

在我的测试中:

return expect(s.sendNote(data)).to.eventually.be.rejectedWith('Boo');

但是,当测试通过时,它会将错误抛出到控制台 .

未处理的拒绝错误:嘘......

对于非promise错误,我使用bind来测试以防止在Chai可以包装和测试之前抛出错误:

return expect(s.sendNote.bind(s, data)).to.eventually.be.rejectedWith('Boo');

但是这不适用于此并返回:

TypeError: [Function] is not a thenable.

测试这个的正确方法是什么?

4 回答

  • 0

    我个人使用那个成语:

    it('rejects as promised', function() {
        return Promise.reject("caw")
            .then(
              (m) => { assert.fail('was not supposed to succeed'); }
              (m) => { /* some extra tests here */ }
            );
    });
    

    这是极少数情况下 then(onFulfilled, onRejected) (2个参数)合法使用的情况之一 .

    如果你按照其他答案中的建议链接 .then(reject).catch(onRejected) ,你每次都会进入 catch 处理程序,因为它会捕获前面的 then 处理程序中产生的拒绝 - 如果你不够仔细检查,可能会导致常绿测试那种可能性 .

  • 4

    您收到错误是因为sendNote被拒绝而您没有 grab 它 .

    尝试:

    var callPromise = self.doCall('POST', '/Invoice', {
      Invoice: data
    }).then(function(res) {
      return data;
    });
    
    callPromise.catch(function(reason) {
      console.info('sendNote failed with reason:', reason);
    });
    
    return callPromise;
    

    看起来你还必须将现有的一个块移出:

    var res = this.queue.then(function() {
      return self.client.callAsync(verb, method, data)
        .then(function(res) {
          return;
        });
      }).catch(function(err) {    
        // This is what gets called in my test    
        return P.reject('Boo');
      });
    
  • 6

    (免责声明:即使是那些不使用Bluebird的人,这也是一个很好的问题 . 我发布了类似的答案here;这个答案适用于那些没有使用Bluebird的人 . )

    与chai-as-promise

    以下是如何使用chai-as-promise来测试Promise的 resolvereject 个案:

    var chai = require('chai');
    var expect = chai.expect;
    var chaiAsPromised = require("chai-as-promised");
    chai.use(chaiAsPromised);
    
    ...
    
    it('resolves as promised', function() {
        return expect(Promise.resolve('woof')).to.eventually.equal('woof');
    });
    
    it('rejects as promised', function() {
        return expect(Promise.reject('caw')).to.be.rejectedWith('caw');
    });
    

    没有柴 - 承诺

    你可以完成同样的事情,而不像这样承诺:

    it('resolves as promised', function() {
      return Promise.resolve("woof")
        .then(function(m) { expect(m).to.equal('woof'); })
        .catch(function(e) { throw e })  // use error thrown by test suite
               ;
    });
    
    it('rejects as promised', function() {
        return Promise.reject("caw")
            .then(function(m) { throw new Error('was not supposed to succeed'); })
            .catch(function(m) { expect(m).to.equal('caw'); })
                ;
    });
    
  • 15

    我遇到了同样的问题,但在做了很多黑客攻击时,我找到了一个用于测试mocha中被拒绝的承诺的解决方案 .

    write mocha code as below

    it('works with resolved and rejected promises', function() {
     return yourPromiseFunction("paramifrequired")
           .then((result)=>{
                //check with should or expect
           }).catch((result)=>{
                //check with should or expect whether it's rejected with proper result status. set result status in promise function while rejecting accordingly
           })
    
      });
    

    注意: - 希望您觉得它很有用 . 如果你有另一个想法建议,请评论我,我是新手探索js世界

相关问题