Mam problemy z expect.to.throw
uruchomieniem Chai w teście dla mojej aplikacji node.js. Test wciąż nie powiedzie się w przypadku wyrzuconego błędu, ale jeśli opakuję przypadek testowy podczas próby złapania i potwierdzenia złapanego błędu, zadziała.
Nie expect.to.throw
działa tak, jak myślę, że powinno lub coś takiego?
it('should throw an error if you try to get an undefined property', function (done) {
var params = { a: 'test', b: 'test', c: 'test' };
var model = new TestModel(MOCK_REQUEST, params);
// neither of these work
expect(model.get('z')).to.throw('Property does not exist in model schema.');
expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
// this works
try {
model.get('z');
}
catch(err) {
expect(err).to.eql(new Error('Property does not exist in model schema.'));
}
done();
});
Awaria:
19 passing (25ms)
1 failing
1) Model Base should throw an error if you try to get an undefined property:
Error: Property does not exist in model schema.
javascript
node.js
mocha
chai
do re mi
źródło
źródło
model
instancja ma funkcję get, którą przekazałem / wywołałem w oczekiwaniu.to.throw
jest testowanie określonego warunku w funkcji, który wymaga wywołania tej funkcji z niepoprawnym stanem / argumentami. (Jeśli o to chodzi ... dlaczego deeplinks chaijs.com nie jest tak naprawdę deeplink?)Jak mówi ta odpowiedź , możesz po prostu owinąć swój kod anonimową funkcją:
źródło
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
ponieważ nie ma metody powiadamiania.catch (err) { expect(err).equal('Error message to be checked'); done(); }
this
wewnątrz wywoływanej funkcji. To.bind
jest właściwa droga.A jeśli już używasz ES6 / ES2015, możesz również użyć funkcji strzałki. Jest to w zasadzie to samo, co używanie zwykłej anonimowej funkcji, ale jest krótsze.
źródło
this
this
po zakresie, w którym zostały utworzone. Często może to być zaletą, ponieważ pozwala uniknąć konieczności ręcznego wprowadzaniabind
funkcji do ichthis
obiektu.bind
i zawsze wiąże sięthis
z zakresem nadrzędnym. Moim zamiarem w komentarzu było jedynie upewnienie się, że czytelnicy są świadomi potencjalnego upadku.To pytanie ma wiele, wiele duplikatów, w tym pytania nie wspominające o bibliotece asercji Chai. Oto podstawy zebrane razem:
Asercja musi wywołać funkcję, zamiast natychmiastowej oceny.
Możesz sprawdzić określone błędy za pomocą dowolnej biblioteki asercji:
Węzeł
Powinien
Chai Expect
Musisz poradzić sobie z wyjątkami, które „uciekają” z testu
Na początku może to wydawać się mylące. Podobnie jak jazda na rowerze, po prostu „kliknie” na zawsze, gdy kliknie.
źródło
przykłady z dokumentu ...;)
ponieważ polegasz na
this
kontekście:musisz użyć jednej z tych opcji:
powiązać kontekst
źródło
Inna możliwa implementacja, bardziej kłopotliwa niż rozwiązanie .bind (), ale taka, która pomaga uczynić punkt oczekiwany () wymagającym funkcji, która zapewnia
this
kontekst dla omawianej funkcji, można użyćcall()
np.expect(function() {model.get.call(model, 'z');}).to.throw('...');
źródło
Znalazłem dobry sposób na obejście tego:
Jest o wiele bardziej czytelny niż moja stara wersja:
źródło