Problemas al espiar las llamadas al método en un enrutador de red troncal para garantizar que el método sea el correcto en una ruta determinada.Espiando las llamadas a la ruta Backbone.js con Jasmine
extracto de la prueba
describe 'Router', ->
beforeEach ->
@router = new App.Router()
Backbone.history.start()
afterEach ->
Backbone.history.stop()
describe 'routes', ->
it 'should be defined', ->
expect(@router.routes).toBeDefined()
describe 'default route', ->
it 'should be defined', ->
expect(@router.routes['']).toBeDefined()
it 'should call index', ->
spy = spyOn(@router, "index")
@router.navigate('', true)
expect(spy).toHaveBeenCalled()
El router
class App.Router extends Backbone.Router
routes:
'' : 'index'
index: ->
console.log "router.index has been called"
Todo pasa, excepto la última prueba "debe llamar índice". Falla con el mensaje "Se ha llamado el índice de espionaje esperado". He intentado otras variantes
it "should call index", ->
spyOn(@router, "index")
@router.navigate('', true)
expect(@router.index).toHaveBeenCalled()
también puedo ver el "router.index se ha llamado" la salida del registro en la salida de prueba de la función original Router.index
Gracias!
EDIT: Una solución
describe '#1 Solution', ->
it 'should call index', ->
spyOn(App.Router.prototype, "index")
@router = new App.Router()
Backbone.history.start()
@router.navigate('', true)
expect(App.Router.prototype.index).toHaveBeenCalled()
¡Gracias! Parece que es el camino a seguir :) – eldewall
Esta no es una forma viable de probar la activación de una ruta. Todo lo que se está probando es que la función de índice estaba vinculada al enrutador como una devolución de llamada, no que la función realmente se llama cuando se desencadenó la ruta. Ver [este S.O. post] (http://stackoverflow.com/questions/9215737/testing-routers-in-backbone-js-properly) para saber cómo se llamó a la función de ruta correspondiente cuando un enrutador coincide con una url. – louism2