3

いくつかの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()

AviaViewinitialize()を呼び出すと、MatricesViewコンストラクターが確実に呼び出されます。これは次の行のおかげです。

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

それは間違いなく機能します。アプリを手動で実行すると、の間にコンストラクターが呼び出されていることがわかりますinitialize()。しかし、私のジャスミン仕様は失敗します:

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.

私は私の同僚の何人かと話しました、そして彼らはこれがうまくいくはずであることに同意します...誰かがコンストラクターをスパイする良い方法を提案できますか?

4

1 に答える 1

5

どうですか:

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()
于 2011-11-29T22:25:59.320 に答える