2015-10-16 189 views
1

對於摩卡測試,我想斷言承諾最終會被拒絕。如何「反向」拒絕/履行承諾?

我不想使用chai-as-promised。我寧願使用Node的標準斷言模塊,也只是使用標準的ES6承諾。

我想出這個是最好的,但感覺稍微哈克:

it('foo should reject given bad data', function() { 
    var rejected; 

    return foo('bad data').catch(function (err) { 
    rejected = true; 
    }).then(function() { 
    assert(rejected); 
    }); 
}); 

任何人都可以提出一個更整潔,更富有表現力的方式來「反向」一個承諾,所以拒絕履行成爲副反之亦然?

回答

1

您可以直接通過truefalse聲明分辨率和拒絕回調。

it('foo should reject given bad data', function() { 
    return foo('bad data').then(function() { 
     assert(false); 
    }, function() { 
     assert(true); 
    }); 
}); 
1

你可以使用一個.done()像這樣做:

it('foo should reject given bad data', function() { 
    return foo('bad data') 
    .done(assert.equal.bind(null, 'false', 'true', null), assert); 
}); 

我用值assert.equal,將提供的assert(false)等價,但可以明顯地刪除最後null如果要打印實際結果。

編輯:你可以定義自己的assertFail功能實際上使這種清潔的多重考驗:

function assertFail() { assert(false); } 

it('foo should reject given bad data', function() { 
    return foo('bad data') 
    .done(assertFail, assert); 
}); 
-1

您可以添加到答應原型逆向方法,然後就用它。

Promise.prototype.reverse = function() { 
    return new Promise((resolve, reject) => { 
    this.then(reject).catch(resolve); 
    }); 
} 

foo('bad data') 
    .reverse() 
    .then(e => assert(true)) 
    .catch(e => assert(false));