Attendre que les fonctions soient appelées avec des fonctions comme paramètres
-
29-10-2019 - |
Question
J'ai un ensemble assez simple de spécifications pour une vue du backbone:
describe 'Avia.MatricesView', ->
beforeEach ->
@model = {
bind: ->
fetch: ->
}
spyOn(Avia, 'Matrices').andReturn(@model)
@matricesView = new Avia.AviaView(addFixtureDiv('fixture'))
describe 'initialization', ->
beforeEach ->
spyOn(@model, 'bind')
spyOn(@model, 'fetch')
@matricesView.initialize()
it 'creates a new Matrices model', ->
expect(Avia.Matrices).toHaveBeenCalledOnce()
it 'binds the model change event to render', ->
expect(@model.bind).toHaveBeenCalledWith('change', @matricesView.render)
it 'fetches the model data', ->
expect(@model.fetch).toHaveBeenCalledWith(success: @matricesView.render, error: @matricesView.showError)
Le MatricesView fait exactement ce que la spécification attend:
initialize: =>
@model = new Avia.Matrices()
@model.bind('change', @render)
@model.fetch(success: @render, error: @showError)
showError: =>
alert('An error occurred while fetching data from the server.')
render: =>
html = JST['views/matrices_view_template']()
@el.html(html)
L'espoir qu'un nouveau modèle Matrices est en cours de création passe.Les deux autres spécifications échouent, cependant, d'une manière qui me confond:
Avia.MatricesView initialization binds the model change event to render. (/home/duncan/avia/spec/javascripts/views/matrices_view_spec.js.coffee:21)
Expected spy bind to have been called with [ 'change', Function ] but was called with [ [ 'change', Function ] ] (line ~22)
expect(this.model.bind).toHaveBeenCalledWith('change', this.matricesView.render);
Avia.MatricesView initialization fetches the model data. (/home/duncan/avia/spec/javascripts/views/matrices_view_spec.js.coffee:24)
Expected spy fetch to have been called with [ { success : Function, error : undefined } ] but was called with [ [ { success : Function, error : Function } ] ] (line ~25)
expect(this.model.fetch).toHaveBeenCalledWith({
Pour autant que je sache, Jasmine pense que la fonction retournée par @matricesView.render
dans le cadre de la spécification est différente de la fonction retournée par @render
dans la portée de l'instance de MatricesView.
De plus, je ne comprends pas du tout pourquoi @matricesView.showError
n'est pas défini alors qu'il est clairement défini dans MatricesView.
Toute aide serait grandement appréciée.J'ai vraiment besoin d'une deuxième paire d'yeux car les miens sont un peu fatigués en ce moment: - /
La solution
D'accord, je suis vraiment embarrassé maintenant.En regardant cela avec une nouvelle paire d'yeux le matin:
@matricesView = new Avia.AviaView(addFixtureDiv('fixture'))
... aurait dû être ...
@matricesView = new Avia.MatricesView(addFixtureDiv('fixture'))
Le test aurait dû échouer, car je testais en fait la mauvaise classe.
o_O
Autres conseils
Le premier test qui a échoué semble être lié à ce problème: https://github.com/pivotal / jasmine / issues / 45 Essayez d'encapsuler vos arguments dans un tableau:
expect(@model.bind).toHaveBeenCalledWith(['change', @matricesView.render])
Le second est plus déroutant - il n'y a aucun moyen que @matricesView.showError
ne soit pas défini (et vous pouvez ajouter un console.log
pour le confirmer).C'est donc probablement juste un problème de stringification;essayez de produire un scénario de test simplifié et de le publier dans l'outil de suivi des problèmes Jasmine.Mais pour faire passer le test, essayez le wrapping de tableau.Si cela ne fonctionne pas, est-ce que Jasmine teste l'égalité des références plutôt que l'égalité profonde des objets?Si tel est le cas, vous pouvez essayer le comparateur objectContaining récemment ajouté.