Если B:f
не является виртуальным, то обе функции D:f
будут плохо сформированы.
Вы должны передать функцию expect
. Например:
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.'));
Как вы это делаете, вы переходите к expect
результату вызова model.get('z')
. Но чтобы проверить, что-то брошено, вам нужно передать функцию expect
, которую expect
будет вызывать сам. Используемый выше метод bind
создает новую функцию, которая при вызове вызовет model.get
с this
, установленным на значение model
, и первым аргументом, установленным на 'z'
.
Этот вопрос имеет много, много дубликатов, включая вопросы, не упоминающие библиотеку утверждения Chai. Вот основные сведения, собранные вместе:
Утверждение должно вызывать функцию, а не сразу оценивать.
assert.throws(x.y.z);
// FAIL. x.y.z throws an exception, which immediately exits the
// enclosing block, so assert.throw() not called.
assert.throws(()=>x.y.z);
// assert.throw() is called with a function, which only throws
// when assert.throw executes the function.
assert.throws(function () { x.y.z });
// if you cannot use ES6 at work
function badReference() { x.y.z }; assert.throws(badReference);
// for the verbose
assert.throws(()=>model.get(z));
// the specific example given.
homegrownAssertThrows(model.get, z);
// a style common in Python, but not in JavaScript
Вы можете проверить наличие определенных ошибок с помощью любой библиотеки утверждений:
assert.throws(() => x.y.z);
assert.throws(() => x.y.z, ReferenceError);
assert.throws(() => x.y.z, ReferenceError, /is not defined/);
assert.throws(() => x.y.z, /is not defined/);
assert.doesNotThrow(() => 42);
assert.throws(() => x.y.z, Error);
assert.throws(() => model.get.z, /Property does not exist in model schema./)
should.throws(() => x.y.z);
should.throws(() => x.y.z, ReferenceError);
should.throws(() => x.y.z, ReferenceError, /is not defined/);
should.throws(() => x.y.z, /is not defined/);
should.doesNotThrow(() => 42);
should.throws(() => x.y.z, Error);
should.throws(() => model.get.z, /Property does not exist in model schema./)
expect(() => x.y.z).to.throw();
expect(() => x.y.z).to.throw(ReferenceError);
expect(() => x.y.z).to.throw(ReferenceError, /is not defined/);
expect(() => x.y.z).to.throw(/is not defined/);
expect(() => 42).not.to.throw();
expect(() => x.y.z).to.throw(Error);
expect(() => model.get.z).to.throw(/Property does not exist in model schema./);
Вы должны обрабатывать исключения, которые «выходят» из теста
it('should handle escaped errors', function () {
try {
expect(() => x.y.z).not.to.throw(RangeError);
} catch (err) {
expect(err).to.be.a(ReferenceError);
}
});
Это может показаться запутанным вначале. Как ездить на велосипеде, он просто «нажимает» навсегда, как только нажимает.
Как этот ответ говорит , вы также можете просто обернуть свой код анонимной функцией следующим образом:
expect(function(){
model.get('z');
}).to.throw('Property does not exist in model schema.');
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
Поскольку метода уведомления не существует.
– Anand N
15 February 2015 в 13:53
catch (err) { expect(err).equal('Error message to be checked'); done(); }
– Anand N
20 April 2015 в 07:58
this
внутри вызываемой функции. Тогда .bind
- правильный путь.
– rabbitco
1 December 2016 в 16:21
И если вы уже используете ES6 / ES2015, вы также можете использовать функцию стрелки. Это в основном то же самое, что и обычная анонимная функция, но короче.
expect(() => model.get('z')).to.throw('Property does not exist in model schema.');
из doc ...;)
, потому что вы полагаетесь на этот контекст :
, вы должны использовать один из следующих вариантов:
// wrap the method or function call inside of another function
expect(function () { cat.meow(); }).to.throw(); // Function expression
expect(() => cat.meow()).to.throw(); // ES6 arrow function
// bind the context
expect(cat.meow.bind(cat)).to.throw(); // Bind
model
имеет функцию, называемую get, которую я передал / вызывал в ожидании. – doremi 5 February 2014 в 22:00to.throw
- это тестирование определенного условия внутри функции, которое требует вызова этой функции с недопустимым состоянием / аргументами. (В этом отношении .... почему бы не отключить chaijs.com deeplinks?) – ericsoco 19 August 2014 в 17:44