2015-03-02 3 views
4

Я использую this polyfill for ES6 promises и Mocha/Chai.ES6 Promises in Mocha

Мои утверждения для обещаний не работают. Ниже приводится тестовый образец:

it('should fail', function(done) { 
    new Promise(function(resolve, reject) { 
     resolve(false); 
    }).then(function(result) { 
     assert.equal(result, true); 
     done(); 
    }).catch(function(err) { 
     console.log(err); 
    }); 
}); 

Когда я запускаю этот тест он терпит неудачу из-за тайм-аута. Ошибка подтверждения, которая была выбрана в блоке then, попадает в блок catch. Как я могу избежать этого и просто бросить его прямо к Моке?

Я мог бы просто выбросить его из функции catch, но как я могу сделать утверждения для блока catch?

+1

Вы проверили [это] (http://mochajs.org/#asynchronous-code)? – thefourtheye

+0

не должен быть у вас, '' 'console.log (err); done (err);' ''? – mido

+0

@thefourtheye обещания обещания - это то, что я ищу. Спасибо, это хороший ресурс. – connorbode

ответ

3

Я решил решить свою проблему, используя Chai as Promised.

Это позволяет делать утверждения о разрешении и отбраковки обещаний:

  • return promise.should.become(value)
  • return promise.should.be.rejected
4

Если у вашего обещания есть сбой, он вызовет только ваш обратный вызов. В результате, обратный вызов Mocha никогда не вызывается, и Моча никогда не выясняет, что Promise потерпела неудачу (так что он ждет и в итоге истекает).

Вы должны заменить console.log(err); на done(err);. Mocha должен автоматически отображать сообщение об ошибке, когда вы передаете ошибку в завершенный обратный вызов.

+0

Как я могу затем сделать утверждения об отклонениях, которые сделаны обещанием? – connorbode

+0

Что вы подразумеваете под этим? Предполагается ли обещание преуспеть или потерпеть неудачу? Если он должен преуспеть, я не понимаю, почему вам нужно было бы утверждать что-либо об отказе, если вы убедитесь, что этого не происходит. –

+0

Потому что вы хотели бы сделать утверждения об условиях, при которых обещание отвергается. – connorbode

2

шаблон я использую в моих Mocha/Chai/ES6-обещание испытаний следующие:

it('should do something', function() { 

    aPromiseReturningMethod(arg1, arg2) 
    .then(function (response) { 
     expect(response.someField).to.equal("Some value") 
    }) 
    .then(function() { 
     return anotherPromiseReturningMethod(arg1, arg2) 
    }) 
    .then(function (response) { 
     expect(response.something).to.equal("something") 
    }) 
    .then(done).catch(done) 

}) 

Последний li ne - странно выглядящий, но называет Mocha совершенным или успешным.

Одна проблема, если последняя возвращает что-то, то мне нужно Nööp() * перед тем как в then и catch:

it('should do something', function() { 

    aPromiseReturningMethod(arg1, arg2) 
    .then(function (response) { 
     expect(response.someField).to.equal("Some value") 
    }) 
    .then(function() { 
     return anotherPromiseReturningMethod(arg1, arg2) 
    }) 
    .then(_.noop).then(done).catch(done) 

}) 

* Ноопа Lodash (в).

Хотелось бы услышать любые критические замечания по этому образцу.

+0

Лично я не возвращал ничего из любого из обработчиков onFullFilled в тестовых случаях. Но для защиты от возвращаемых значений '.then (done.bind (null, null), done)' кажется немного более кратким для меня. –