UPDATE 2-июль-2013тестирование ошибка передается обратно с обратными вызовами с мокко и должен
Используя последний подход с обернутой анонимной функцией можно ввести какое-то странное поведение проверки. Если вы ожидаете порочную ошибку, но есть ошибка в фактическом выполнении, тест пройдет, но передаст любую ошибку и, возможно, не тот, который вы ожидали. Я делаю две вещи, если это ошибка, которую я указываю, я гарантирую, что текст ошибки вернется из заглушки, и возникшая ошибка будет одинаковой. Если это из сторонней библиотеки, где я не обязательно знаю ошибки, я поставлю какое-то произвольное значение, чтобы я знал, что проходы относятся к единицам, которые я тестирую. Пример использования sinon.js для того, чтобы заглушить немного шизания.
it('should return an error if the save fails', function(){
stubCall.restore();
stubCall = sinon.stub(Provider, 'save').callsArgWith(1, new Error('Save Error'));
(function(){
User.create(fakeUser, function(err, user){
if(err)
throw err;
});
}).should.throw("Save Error");
});
Я получаю в Node.js и пытаюсь сделать некоторое поведение Driven Development (BDD) с мокко и should.js (и Синоном там, а также в каком-то момент).
Одна вещь, я имею проблемы с тестирует ошибок, возвращаемые обратного вызова, например, этот простой тест:
it('should return an error if you try and execute an invalid Query object', function() {
var stubQuery = {};
Provider.execute(stubQuery, function (err) {
//should.not.exist(err);
should.have.property('message', 'Invalid Query Object');
});
});
с функцией:
PostgresqlProvider.prototype.execute = function (query, cb) {
};
Не имеет значения, что я пытаюсь протестировать, тест всегда проходит (should.exist и т. Д.), И единственный способ, с помощью которого я могу получить его сбой, - это добавить cb (null); в функцию выполнения, которая вроде бы идет вразрез с тем, что я делаю, поскольку я пытаюсь протестировать, прежде чем добавлять поведение, а не добавлять поведение для отказа от теста.
Я знаю, что я делаю какую-то реальную ошибку newb, возможно, на нескольких уровнях, но я не разбираюсь в тестировании ошибки, переданной в качестве обратного вызова, не выбрасывается (что, я уверен, я мог бы легче протестировать)!
UPDATE
Используя код от Герман, я отрегулирован и что на самом деле слова (тест не удается без какого-либо поведения, определенного)
it('should return an error if you try and execute an invalid Query object', function() {
var stubQuery = {};
Provider.execute(stubQuery, function (err) {
if (err) throw new Error(err);
}).should.throw();
});
вопрос сейчас находится, я не могу «поймать» ошибка, посланная в обратном вызове для прохождения теста, метод should.throw не вызывается, он просто заявляет, что ожидал, что произойдет бросок, но даже несмотря на то, что я возвращаю ошибку для обратного вызова из моего метода. Это может быть до области , но я не уверен, что я должен добавить некоторую форму закрытия и на каком уровне.
UPDATE 2
Фигурные это, мне нужно, чтобы обернуть вызов функции внутри закрытия, а не обратного вызова (Doh!), А затем поместить Assert (should.throw) в конце закрытие;
it('should return an error if you try and execute an invalid Query object', function() {
var stubQuery = {};
(function(){
Provider.execute(stubQuery, function (err) {
if (err)
throw err;
});
}).should.throw();
});
ОК, я попробовал код. Проблема заключалась в том, что 'should.throw()' проверяет функцию 'Provider', а не обратный вызов внутри, чтобы выбросить исключение, поэтому ваш тестовый проход. Вместо этого используйте блок 'try..catch' (пример в моем обновлении ответа), конечно, вы можете придумать что-то более элегантное, чем мой пример :) –
(ON UPDATE 2): LOL. Я не понял, что оболочка '(function() Provider ...', good one! –
Я в аналогичной ситуации. Знаете ли вы, есть ли способ проверить объект ошибки, не бросая его? попробуйте что-то вроде: '' 'error.should.eql (новая ошибка ('моя ошибка'))' '', но, похоже, она всегда проходит (даже если текст ошибки неверен). – snapfractalpop