Backbone Marionette事件.Event聚合器和测试

时间:2012-08-02 13:37:24

标签: backbone.js marionette

我的测试时间问题。我正在使用事件聚合器来引发事件,问题是我的规范在代码到达引发的事件之前完成。我需要在规范代码运行后运行规范。

例如,我正在创建一个布局,然后引发一个事件:

  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”事件处理程序重构为我“设置”并从我的测试中调用的方法。

我很好奇是否有人有更好的想法?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

如果在it完成之前beforeEach正在运行,那么您的设置中有一些异步运行的代码。你必须使用Jasmine的异步功能来完成这项工作。 https://github.com/pivotal/jasmine/wiki/Asynchronous-specs

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