Шпионаж на конструкторе Javascript с использованием Jasmine - PullRequest
3 голосов
/ 30 ноября 2011

Я пишу спецификации для некоторых классов Javascript (представления backbone.js, написанные на Coffeescript), и я хотел бы убедиться, что одно представление создает другое.

Я пытаюсь сделать это, следя за конструктором, вот так:

describe 'Avia.AviaView', ->

  beforeEach ->
    @aviaView = new Avia.AviaView()
    @matricesView = new Backbone.View()
    spyOn(Avia.MatricesView, 'constructor').andReturn @matricesView

  describe 'initialize', ->

    beforeEach ->
      @aviaView.initialize()

    it 'creates a new MatricesView ', ->
      expect(Avia.MatricesView.constructor).toHaveBeenCalledOnce()

Вызов initialize() в AviaView определенно вызывает конструктор MatricesView, любезно предоставьте эту строку:

new Avia.MatricesView($("#tabs-3")).initialize()

Это определенно работает; если я запускаю приложение вручную, я вижу конструктор, вызываемый во время initialize(). Однако моя спецификация Jasmine терпит неудачу:

Running Jasmine specs...
F

Avia.AviaView initialize creates a new MatricesView . (/Users/dev/avia/spec/javascripts/views/avia_view_spec.js.coffee:13)
  Expected constructor to be called exactly once, but was called '0' times (line ~14)
    expect(Avia.MatricesView.constructor).toHaveBeenCalledOnce();

FAIL: 1 test, 1 failure, 0.008 secs.

Я говорил с несколькими моими коллегами, и они согласны с тем, что этот должен работать ... может кто-нибудь предложить хороший способ шпионить за конструкторами?

1 Ответ

5 голосов
/ 30 ноября 2011

Как насчет:

describe 'Avia.AviaView', ->

  beforeEach ->
    @aviaView = new Avia.AviaView()
    @matricesView = new Backbone.View()
    spyOn(Avia, 'MatricesView').andReturn @matricesView

  describe 'initialize', ->

    beforeEach ->
      @aviaView.initialize()

    it 'creates a new MatricesView ', ->
      expect(Avia.MatricesView).toHaveBeenCalledOnce()
...