2015-03-07 5 views
1

Я довольно новыми для Жасмин, и я должен проверить несколько вызовов функции:Жасмин spyOn не работает

JS КОД

object1 = { 

    function1: function() { 
     // object1.function2 is a callback 
     object2.someFunction("called", object1.function2) 
    }, 

    function2: function() { 
     // code to do stuff 
    } 

} 

TEST CODE

describe("test suite", function(){ 
    it("test1", function(){ 
      spyOn(object1, "function2"); 
      object1.function1(); 
      expect(object1.function2).toHaveBeenCalled(); 
    }); 
}); 

Я пробовал это, но он терпит неудачу, и говорит: «Ожидаемая функция spy2 была вызвана». Может ли кто-нибудь помочь мне с этим? Благодаря

+1

У вас есть единичный тест, который доказывает, что object2.someFunction в конечном итоге вызывает обратный вызов? Тест ЕДИНИЦЫ должен проверить ЕДИНИЦ. Итак, вы должны проверить, что object2.someFunction вызывает обратный вызов, который он передал, и затем вы должны написать тест, чтобы проверить, что функция1 вызывает object2.someFunction , конечно, для этого вам нужно передать объект2 в object1 как параметр либо для функции(), либо для конструктора object1. (Инъекция зависимостей) –

+0

@DaveBush object2 - глобальный объект, поэтому не должно быть проблем с вложением зависимостей, и я уверен, что object2.someFunction вызывает обратный вызов. Однако было бы полезно, если бы вы могли сказать мне, как проверить это. – user3077887

+0

@DaveBush Спасибо, я заметил, что object2.someFunction не вызывает обратный вызов. Я думал, что ошибся с тем, как я использовал spyOn. – user3077887

ответ

3

Вы можете переписать тест следующим образом

describe("test suite", function(){ 
    it("test1", function(done){ 
      spyOn(object1, "function2"); 
      object1.function1(); 
      setTimeout(function() { 
       expect(object1.function2).toHaveBeenCalled(); 
       done(); 
      }); 
    }); 
}); 

Ваш тестовый код должен иметь асинхронное тестирование, так как обратный вызов не будет вызван немедленно. Вы можете добавить еще один асинхронный вызов, который будет размещен после вашего object1.function2 в стеке вызовов, и к моменту выполнения функции внутри setTimeout он уже назвал бы object1.function2, и после того, как будет выполнено утверждение, вы можете завершить асинхронный тест, вызвав done().

Смежные вопросы