Estou tendo problemas para conseguir o Chai expect.to.throw
funcione em um teste para meu aplicativo node.js. O teste continua falhando com o erro gerado, mas se eu envolver o caso de teste na tentativa de capturar e afirmar o erro detectado, ele funcionará.
Não expect.to.throw
funciona como eu acho que deveria ou algo assim?
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();
});
A falha:
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.
fonte
model
A instância tem uma função chamada get, que eu passei / chamei em expect.to.throw
é testar uma condição específica em uma função, o que requer chamar essa função com o estado / argumentos inválidos. (Por falar nisso .... por que não de chaijs.com deeplinks realmente deeplink?)Como esta resposta diz , você também pode simplesmente agrupar seu código em uma função anônima como esta:
fonte
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
Como não há método de notificação.catch (err) { expect(err).equal('Error message to be checked'); done(); }
this
dentro da função a ser chamada. Então.bind
é o caminho certo a seguir.E se você já estiver usando o ES6 / ES2015, também poderá usar a função de seta. É basicamente o mesmo que usar uma função anônima normal, mas mais curta.
fonte
this
this
do escopo em que foram criadas. Geralmente, isso pode ser uma vantagem, pois evita a necessidade debind
inserir funções em seuthis
objeto manualmente.bind
e sempre vincula aothis
escopo pai. Minha intenção no comentário era apenas garantir que os leitores estivessem cientes de uma possível queda de poço.Essa pergunta possui muitas, muitas duplicatas, incluindo perguntas que não mencionam a biblioteca de asserções Chai. Aqui estão os conceitos básicos reunidos:
A asserção deve chamar a função, em vez de avaliar imediatamente.
Você pode verificar se há erros específicos usando qualquer biblioteca de asserções:
Nó
Devemos
Chai Expect
Você deve lidar com exceções que 'escapam' do teste
Isso pode parecer confuso no começo. Como andar de bicicleta, apenas 'clica' para sempre quando clica.
fonte
exemplos de doc ...;)
porque você confia no
this
contexto:você precisa usar uma destas opções:
vincular o contexto
fonte
Outra implementação possível, mais complicada do que a solução .bind (), mas que ajuda a enfatizar que expect () requer uma função que fornece um
this
contexto para a função coberta, você pode usar umcall()
, por exemplo,expect(function() {model.get.call(model, 'z');}).to.throw('...');
fonte
Eu encontrei uma boa maneira de contornar isso:
É muito mais legível que minha versão antiga:
fonte