Poniższy test zachowuje się dziwnie:
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);
})
});
Jak mam odpowiednio obsłużyć odrzuconą obietnicę (i przetestować ją)?
Jak mam poprawnie obsłużyć nieudany test (np .: expect(data.rate).to.have.length(400);
?
Oto implementacja, którą testuję:
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
błąd, gdy próbuje to zrobić z mocha 2.2.5.done
parametru w,it
który by z niego zrezygnował.done
w moimit
wywołaniu zwrotnym i jawne wywołaniereturn
(zgodnie z obietnicą) w wywołaniu zwrotnym jest sposobem, w jaki to działa, podobnie jak we fragmencie kodu.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
parametru doit
wywołania, a to nadal się dzieje ...Jak już wspomniano tutaj , nowsze wersje są już Mocha Obietnica świadomy. Ale ponieważ OP zapytał konkretnie o Chai, uczciwe jest wskazanie
chai-as-promised
pakietu, który zapewnia czystą składnię do testowania obietnic:używając chai-zgodnie z obietnicą
Oto, jak możesz użyć chai-zgodnie z obietnicą, aby przetestować obie
resolve
ireject
przypadki dla Obietnicy:bez herbaty - zgodnie z obietnicą
Aby naprawdę jasno określić, co jest testowane, oto ten sam przykład zakodowany bez chai-zgodnie z obietnicą:
źródło
catch
jest wywoływany, gdy jedno zexpect(s)
niepowodzeń. Daje to mylne wrażenie, że obietnica zawiodła, chociaż tak się nie stało. Tylko oczekiwanie zawiodło.Chai.use
żeby go zamontować. Nigdy bym tego nie wyłowił z dokumentacji, którą mieli. | :(Oto moja opinia:
async/await
Funkcja opóźnionej obietnicy, która kończy się niepowodzeniem, jeśli zostanie podane opóźnienie równe 0:
Pozytywny test jest raczej prosty. Niespodziewana awaria (zasymulowana przez
500→0
) automatycznie nie przejdzie testu, ponieważ odrzucona obietnica eskaluje.Test negatywny wykorzystuje ideę try-catch. Jednak: „narzekanie” na niepożądany przebieg ma miejsce dopiero po klauzuli catch (w ten sposób nie kończy się w klauzuli catch (), wywołując dalsze, ale wprowadzające w błąd błędy.
Aby ta strategia zadziałała, należy zwrócić test z klauzuli catch. Jeśli nie chcesz testować niczego innego, użyj innego it () - block.
źródło
To lepsze rozwiązanie. Po prostu zwróć błąd z wykonanym w bloku catch.
ten test zakończy się niepowodzeniem i zostanie wyświetlony następujący komunikat:
AssertionError: expected 1 to equal 11
źródło