2015-02-24 82 views
8

我應該如何測試,與摩卡和柴,我的承諾失敗?測試失敗的承諾與摩卡的內置承諾支持

我很困惑,因爲我最初以爲我應該使用「摩卡作爲許諾的」,但 包現在已經過時(我用摩卡2.1.0),與建議 只使用諾言測試,現在已經建成摩卡。 看到:https://github.com/domenic/mocha-as-promised

另一篇文章建議廢除「完成」的說法到 它()回調 - 不知道我知道爲什麼,因爲我的理解是通過在「做」參數 的樣子信號測試是 異步測試。 請參閱:How do I properly test promises with mocha and chai?

無論如何,我試圖減少我的問題到下面的代碼 - 請幫我修改這個,以便我可以測試我的承諾確實失敗。

it.only("do something (negative test)", function (done) { 

    var Q = require('q'); 

    function makePromise() { 
    var deferred = Q.defer(); 
    deferred.reject(Error('fail')); 
    return deferred.promise; 
    }; 

    makePromise() 
    .then(done, done); 

}); 

回答

3

您可以返回一個承諾,以表示該測試是異步的:

function something() { 
    return Q.reject(Error('fail')); 
} 

it('should reject', function() { 
    return something().then(function() { 
    throw new Error('expected rejection'); 
    }, 
    function() { 
    return 'passed :]'; 
    }); 
}); 
10

一些更多的挖掘,它似乎正確的方法是增加額外的catch塊,像這樣......

it.only("do something (negative test)", function (done) { 

    var Q = require('q'); 

    function makePromise() { 
    var deferred = Q.defer(); 
    deferred.reject(Error('fail')); 
    return deferred.promise; 
    }; 

    makePromise() 
    .catch(function(e) { 
    expect(e.message).to.equal('fail'); 
    }) 
    .then(done, done); 

}); 

我對另類想法感興趣,或者確認這是好的方式..謝謝。

UPDATE:

本 - 我現在什麼神交你說,ESP。從本傑明G.簡潔的,但有用的評論後

總結:

當您在done參數傳遞,測試預計將引發它的「做岬」通過調用done()功能;

如果您未通過done參數,它通常只適用於同步呼叫。然而,如果你的返回承諾,摩卡框架(摩卡> 1.18)將捕獲任何通常會被吞噬的失敗(按照承諾規範)。下面是一個更新版本:

it.only("standalone neg test for mocha+promises", function() { 

    var Q = require('q'); 

    function makePromise() { 
    var deferred = Q.defer(); 
    deferred.reject(Error('fail')); 
    return deferred.promise; 
    }; 

    return makePromise() 
    .catch(function(e) { 
    expect(e.message).to.equal('fail'); 
    }); 

}); 
+2

你可以'返回'makePromise()'並移除'done,done'部分。 – 2015-02-24 23:35:29

+0

我會添加一個額外的斷言,以確保它沒有達到接受的情況。 '返回makePromise() 。然後(()=> {// 驗收的情況下,我們不應該到這裏 預期()失敗( '例外似乎沒有被拋出');} ( e)=> { //失敗的情況下,我們應該在這裏和消息shoudl匹配 expect(e.message).to.equal('fail'); }); ' – gmetzker 2017-01-09 22:14:22

1

chai-as-promised提供承諾一個乾淨的測試框架:

$ npm install chai-as-promised 

在您的測試文件:

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('resolved as promised', function() { 
    return Promise.resolve("woof") 
     .then(function(m) { expect(m).to.equal('woof'); }) 
     .catch(function(m) { throw new Error('was not supposed to fail'); }) 
      ; 
}); 

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

我試圖使用chai-as-promised,我的異步方法返回延期庫(https://www.npmjs.com/package/deferred)的承諾。當我運行測試時,我得到了錯誤。是否支持這個模塊? 「TypeError:無法讀取屬性'然後'未定義」 – 2016-09-26 11:43:23

+0

@PiyushBeli:確保「喂」的形式返回一個承諾。例如,確保它有一個return語句。 – 2016-09-26 15:57:52