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: - /

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top