O seguinte teste está se comportando de maneira estranha:
it('Should return the exchange rates for btc_ltc', function(done) {
var pair = 'btc_ltc';
shapeshift.getRate(pair)
.then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
done();
})
.catch(function(err){
//this should really be `.catch` for a failed request, but
//instead it looks like chai is picking this up when a test fails
done(err);
})
});
Como devo lidar adequadamente com uma promessa rejeitada (e testá-la)?
Como devo lidar adequadamente com um teste que falhou (ou seja expect(data.rate).to.have.length(400);
:?
Aqui está a implementação que estou testando:
var requestp = require('request-promise');
var shapeshift = module.exports = {};
var url = 'http://shapeshift.io';
shapeshift.getRate = function(pair){
return requestp({
url: url + '/rate/' + pair,
json: true
});
};
Ensure the done() callback is being called in this test
erro ao tentar fazer isso com o mocha 2.2.5.done
parâmetro noit
qual seria desativado.done
no meuit
retorno, e explicitamente chamarreturn
(a promessa) na chamada de retorno é como eu tenho que trabalhar, assim como no trecho de código.Alternately, instead of using the done() callback, you may return a Promise. This is useful if the APIs you are testing return promises instead of taking callbacks:
done
parâmetro para ait
chamada, e isso ainda está acontecendo ...Como já apontado aqui , as versões mais recentes do Mocha já têm reconhecimento de promessa. Mas como o OP perguntou especificamente sobre Chai, é justo apontar o
chai-as-promised
pacote que fornece uma sintaxe limpa para as promessas de teste:usando chai como prometido
Veja como você pode usar chai-as-prometeu teste tanto
resolve
ereject
casos de uma promessa:sem chai como prometido
Para deixar bem claro o que está sendo testado, eis o mesmo exemplo codificado sem o chai-conforme-prometido:
fonte
catch
é invocado quando um dosexpect(s)
falha. Isso dá uma impressão errada de que a promessa falhou, embora não tenha cumprido. É apenas a expectativa que falhou.Chai.use
para montá-lo. Eu nunca teria pegado isso na documentação que eles tinham. | :(Aqui está a minha opinião:
async/await
Uma função de promessa atrasada, que falha, se receber um atraso de 0:
Teste positivo é bastante simples. Falha inesperada (simulação por
500→0
) falhará no teste automaticamente, à medida que a promessa rejeitada aumenta.O teste negativo usa a ideia de tentar pegar. No entanto: 'reclamar' de um passe indesejado ocorre somente após a cláusula catch (dessa forma, ele não termina na cláusula catch (), desencadeando erros adicionais, porém enganosos.
Para que essa estratégia funcione, é preciso retornar o teste da cláusula catch. Se você não quiser testar mais nada, use outro bloco it () -.
fonte
Há uma solução melhor. Basta retornar o erro com done em um bloco catch.
este teste falhará com a seguinte mensagem:
AssertionError: expected 1 to equal 11
fonte