我的测试时间问题。我正在使用事件聚合器来引发事件,问题是我的规范在代码到达引发的事件之前完成。我需要在规范代码运行后运行规范。
例如,我正在创建一个布局,然后引发一个事件:
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”事件处理程序重构为我“设置”并从我的测试中调用的方法。
我很好奇是否有人有更好的想法?
答案 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”事件来进行第二次测试。