簡體   English   中英

測試在Mocha / Chai中拒絕了承諾

[英]Testing rejected promise in Mocha/Chai

我有一個拒絕承諾的課程:

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.

測試這個的正確方法是什么?

(免責聲明:即使對於不使用Bluebird的人來說這也是一個很好的問題。我在這里發布了類似的答案;這個答案適用於那些沒有使用Bluebird的人。)

與柴承諾

以下是如何使用chai-as-promised來測試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'); })
            ;
});

我個人使用那個成語:

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處理程序-這可能會導致常綠測試如果你不小心檢查那種可能性。

您收到錯誤是因為sendNote被拒絕而您沒有抓住它。

嘗試:

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');
  });

我遇到了同樣的問題,但在做了很多黑客攻擊時,我找到了一個用於測試mocha中被拒絕的承諾的解決方案。

寫下摩卡代碼如下

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世界

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM