javascript - should - nodejs test




Mocha/Chai expect.to.throw não pegando erros lançados (4)

Como esta resposta diz , você também pode apenas quebrar seu código em uma função anônima como esta:

expect(function(){
    model.get('z');
}).to.throw('Property does not exist in model schema.');

Estou tendo problemas para fazer com que o Chai's expect.to.throw em um teste para o meu aplicativo node.js. O teste continua a falhar no erro lançado, mas se eu embrulhar o caso de teste em tentar capturar e afirmar o erro detectado, ele funciona.

expect.to.throw não funcione 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.

E se você já estiver usando ES6 / ES2015, você também pode usar uma função de seta. É basicamente o mesmo que usar uma função anônima normal, mas mais curta.

expect(() => model.get('z')).to.throw('Property does not exist in model schema.');

Uma outra implementação possível, mais complicada do que a solução .bind (), mas que ajuda a tornar o ponto que expect () requer uma função que fornece um contexto para a função coberta, você pode usar uma call() , por exemplo,

expect(function() {model.get.call(model, 'z');}).to.throw('...');


Você tem que passar uma função para expect . Como isso:

expect(model.get.bind(model, 'z')).to.throw('Property does not exist in model schema.');
expect(model.get.bind(model, 'z')).to.throw(new Error('Property does not exist in model schema.'));

Do jeito que você está fazendo, você está expect o resultado de chamar model.get('z') . Mas para testar se alguma coisa é lançada, você tem que passar uma função para expect , que expect se chamar. O método de bind usado acima cria uma nova função que, quando chamada, chamará model.get com this conjunto para o valor de model e o primeiro argumento definido como 'z' .

Uma boa explicação do bind pode ser encontrada here .





chai