2012-10-25 4 views
4

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(); 
    }); 
+0

ОК, я попробовал код. Проблема заключалась в том, что 'should.throw()' проверяет функцию 'Provider', а не обратный вызов внутри, чтобы выбросить исключение, поэтому ваш тестовый проход. Вместо этого используйте блок 'try..catch' (пример в моем обновлении ответа), конечно, вы можете придумать что-то более элегантное, чем мой пример :) –

+0

(ON UPDATE 2): LOL. Я не понял, что оболочка '(function() Provider ...', good one! –

+0

Я в аналогичной ситуации. Знаете ли вы, есть ли способ проверить объект ошибки, не бросая его? попробуйте что-то вроде: '' 'error.should.eql (новая ошибка ('моя ошибка'))' '', но, похоже, она всегда проходит (даже если текст ошибки неверен). – snapfractalpop

ответ

0

Вам необходимо создать исключение внутри вашей тестовой функции для отказа теста.

Я хотел бы добавить if (err) throw "Invalid query error " + err так:

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 "Invalid query error " + err 
    }); 
}); 

Это должно сделать.

(ON UPDATE)

should.throw() не работают для меня тоже ... Я сделал это грязный хак для работы потока:

it('should return an error if you try and execute an invalid Query object', function() { 
    var stubQuery = {}; 

    try { 
    Provider.execute(stubQuery, function (err) { 
     if (err) throw "Invalid query error " + err 
    }); 
    // No error, keep on the flow 
    noError(); 
    } catch (e) { 
    // Error, let's continue the flow there 
    error (e) 
    } 

    function noError() { 
    // The flow in the event we have no error 
    // ... // 
    } 

    function error (errorObj) { 
    // The flow, in the event we have error 
    // ... // 
    } 

}); 

Надеется, что это помогает!

+0

Привет, herman, спасибо за это, он работал (не прошел тест), но я не могу получить the.throw, чтобы работать, чтобы передать его? Я обновил вопрос с прогрессом. – Modika

+0

Перейти к отметке это как ответ, поскольку он получает исходную точку и отвечает на нее, обновил вопрос, включив в него код, который теперь wo rking для меня. – Modika