2015-02-24 4 views
8

Как я должен тестировать, с моккой и чаем, что мое обещание потерпело неудачу?тестирование неудачных обещаний с поддержкой встроенных обещаний mocha

Я смущен, потому что я изначально думал, что я должен использовать «мокко, как обещанный», но пакета теперь осуждается (я использую мокко 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

Некоторые более рытье, и, кажется, правильный путь, чтобы добавить дополнительный блок поймать, как и ...

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:

Бен - теперь я обращал внимание на то, что вы говорили, особы. после краткого, но полезного комментария от Benjamin G.

Резюмируя:

При передаче в качестве параметра done, тест, как ожидается, чтобы вызвать это «сделано Бытийность» путем вызова функции done();

Если вы не проходите в параметре done, он обычно работает только для синхронных вызовов. Тем не менее, , если вы return обещание, рама мокко (мокко> 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». –

+0

Я бы добавил дополнительное утверждение, чтобы убедиться, что оно не попало в регистр приема. 'вернуть makePromise() .then (() => { // Приемка случай, мы не должны получить здесь ожидать() упускают ('исключение не по всей видимости, выброшены.');. }, (e) => { // Ошибка, мы должны получить здесь и сообщение shoudl match ожидать (e.message) .to.equal ('fail'); }); ' – gmetzker

1

chai-as-promised обеспечивает чистую среду тестирования для Promises:

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

Это чувствует себя чистым и интуитивно понятным. Но вы можете сделать что-то подобное без chai-as -обешено так:

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-обещанный, мой метод async возвращает обещание отложенной библиотеки (https://www.npmjs.com/package/deferred). Когда я запускаю тест, я становлюсь ниже ошибки. отложен ли поддерживаемый этой мудой? «TypeError: Can not read property» then «of undefined» –

+0

@PiyushBeli: убедитесь, что форма, которая «подает», «then» возвращает обещание. Например, убедитесь, что в нем есть оператор возврата. –

Смежные вопросы