2013-08-19 8 views
9

Существует обычай событие выстрелил в FooView ..Как проверить, что функция была вызвана после того, как событие было запущено?

// views/foo_view.js 

this.trigger("something:happened"); 

Ассоциированный FooController связывает обработчик, чтобы заботиться о событии ...

// controller/foo_controller.js 

initialize: function() { 
    this.fooView = new FooView(); 
    this.fooView.bind("something:happened", this.onSomethingHappened, this); 
} 

onSomethingHappened: function(event) { 
    // Do something else. 
} 

Чтобы проверить обработку событий я бы написать следующий тест для Jasmine:

it("should do something else when something happens", function() { 
    var fooController = new FooController(); 
    spyOn(fooController, "onSomethingHappened"); 
    fooController.fooView.trigger("something:happened"); 
    expect(fooController.onSomethingHappened).toHaveBeenCalled(); 
}); 

Хотя, тест не пройден ..

FooView should do something else when something happens. 
Expected spy onSomethingHappened to have been called. 
Error: Expected spy onSomethingHappened to have been called. 
    at new jasmine.ExpectationResult (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:114:32) 
    at null.toHaveBeenCalled (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:1235:29) 
    at null.<anonymous> (http://localhost:8888/assets/foo_spec.js?body=true:225:47) 
    at jasmine.Block.execute (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:1064:17) 
    at jasmine.Queue.next_ (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2096:31) 
    at jasmine.Queue.start (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2049:8) 
    at jasmine.Spec.execute (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2376:14) 
    at jasmine.Queue.next_ (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2096:31) 
    at onComplete (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2092:18) 
    at jasmine.Spec.finish (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2350:5) 

Выполняется ли тест, потому что событие занимает больше времени, чем ожидание?

ответ

14

Проблема в том, что вы следите за функцией после того, как функция была связана с событием. Когда жасмин создает шпион, он заменит функцию, которую вы шпионируете с другой функцией.

Так что здесь происходит, является то, что исходная функция связана с событием

this.fooView.bind("something:happened", this.onSomethingHappened, this); 

После этого исходная функция заменяется шпионом, но это не будет иметь никакого влияния на функции вы передаете к функции bind.

Раствор для того, чтобы шпионить FooController.prototype.onSomethingHappened, прежде чем создавать новый экземпляр:

it("should do something else when something happens", function() { 
    var onSomethingHappenedSpy = spyOn(FooController.prototype, "onSomethingHappened"); 
    var fooController = new FooController(); 
    fooController.fooView.trigger("something:happened"); 
    expect(onSomethingHappenedSpy).toHaveBeenCalled(); 
}); 
+0

Awesome! Я заметил, что я на самом деле ** должен создать экземпляр ** контроллера после создания шпиона. Тест работает ** не **, когда я ссылаюсь на 'fooController', созданный в блоке' beforeEach'. Спасибо! – JJD

+0

Работает идеально. Благодаря! – RY35

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

  • Нет связанных вопросов^_^