0

テストでタイミングの問題が発生しています。イベントアグリゲーターを使用してイベントを発生させていますが、問題は、発生したイベントにコードが到達する前に仕様が完了していることです。イベントコードが実行された後に実行するスペックが必要です。

たとえば、レイアウトを作成してからイベントを発生させています。

  DocumentManager.addInitializer(function(){
    DocumentManager.layout = new Layout();

    DocumentManager.layout.on("show", function(){
      DocumentManager.vent.trigger("layout:rendered");
    });

    DocumentManager.content.show(DocumentManager.layout)
  }); 

次に、レイアウトが作成された後、別のビューを作成します。

  DocumentManager.vent.on("layout:rendered", function(){
    Documents.folders = new Documents.Folders();

    Documents.folders.reset(window._rootFolder);    

    Documents.treeRoot = new Documents.TreeRoot({
      collection: Documents.folders
    });

    DocumentManager.layout.treeView.show(Documents.treeRoot);

    DocumentManager.vent.trigger("folder:added");
  });

問題は、このコードが実行される前にスペックが終了することです。

describe 'battlebox', ->
  describe 'versioned documents', ->
    describe 'empty root and no files', ->
      beforeEach ->
        loadFixtures "battlebox.html"
        DocumentManager.start()
        window._rootFolder = Test.Factory.BattleBox.emptyRoot()

      it "should create a root folder", ->
        expect(DocumentManager.Documents.folders.length).toEqual 1

私のオプションは、テストからイベントをトリガーするか、「layout:rendered」イベントハンドラーからコードを「セットアップ」してテストから呼び出すメソッドにリファクタリングすることです。

誰かがもっと良いアイデアを持っているかどうか私は興味がありますか?

4

2 に答える 2

2

私は2種類の非同期チェックを使用します:

仕様の例:

describe 'battlebox', ->
  describe 'versioned documents', ->
    describe 'empty root and no files', ->
      beforeEach ->
        loadFixtures "battlebox.html"

      it "should create a root folder", ->
        # Expect event 'layout:rendered' to be triggered
        TestHelpers.eventTriggeredOn DocumentManager.vent, 'layout:rendered', =>
          expect(DocumentManager.Documents.folders.length).toEqual 1

        # Async bit
        DocumentManager.start()
        window._rootFolder = Test.Factory.BattleBox.emptyRoot()
于 2012-08-06T04:44:21.053 に答える
1

itが終了する前に が実行されている場合はbeforeEach、非同期で実行されているコードがセットアップに含まれています。これを機能させるには、Jasmine の非同期機能を使用する必要があります。https://github.com/pivotal/jasmine/wiki/Asynchronous-specs

また、テストを小さな断片に分割することもできます。フォルダーのレンダリングを容易にするためにトリガーされるイベントがあるため、ここでテストを分割します。イニシャライザがレイアウトを正しく設定していることを 1 つのテストで示します。次に、フォルダが正しくレンダリングされていることを示す別のテストを行います。テストで「layout:rendered」イベントを直接トリガーすることで、2 番目のテストを機能させることができます。

于 2012-08-05T12:15:58.550 に答える