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

我使用两种类型的异步检查:

您的规格示例:

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

此外 - 您可能希望将您的测试分成更小的部分。由于您有一个触发事件以促进文件夹的呈现,因此在此处拆分测试。进行一项测试表明初始化程序正确设置了布局。然后进行另一个测试,显示文件夹正在正确呈现。您可以通过在测试中直接触发“layout:rendered”事件来进行第二次测试。

于 2012-08-05T12:15:58.550 回答