我正在使用 phantomjs 运行 jasmine 测试。我的 jasmine 测试在 describe 块周围使用 require 以确保加载所有正确的模块。
我的测试不会运行,因为page.evaluate -> jasmine.getEnv().execute();
在 requirejs 完成加载模块之前运行。
我想知道是否有人知道解决这个问题的真正好方法。我有一个答案,我将在下面发布,但很想通过其他答案比较笔记。如果你的更好,我会明确选择它作为答案:)
我正在使用 phantomjs 运行 jasmine 测试。我的 jasmine 测试在 describe 块周围使用 require 以确保加载所有正确的模块。
我的测试不会运行,因为page.evaluate -> jasmine.getEnv().execute();
在 requirejs 完成加载模块之前运行。
我想知道是否有人知道解决这个问题的真正好方法。我有一个答案,我将在下面发布,但很想通过其他答案比较笔记。如果你的更好,我会明确选择它作为答案:)
我做了一些不同的事情——我的 HTML 页面有一个函数,包含在一个 require() 调用中:
var run_tests = function (specfiles) {
require(specfiles, function () {
jasmine.getEnv().execute();
});
};
然后我page.evaluate( function (test_specs) { run_tests(test_specs) }, ['test1.spec', 'test2.spec']);
我使用 jQuery 的解决方案是:
在任何测试运行之前加载配置文件。
var jasmine_deferreds = [];
// Setup an event to fire on the document
// I actually did this with native code rather than jquery because
// I wanted to minimize jquery usage
// ....
// setTimeout so all files loaded after this will finish registering their requires
setTimeout( function() {
$.when.apply( null, jasmine_deferreds ).then( function() {
// Fire event that was created
});
}, 5 );
如何构建延迟数组然后解决它们取决于您。我基本上推到了数组,然后在要求完成后解决。我用我自己的版本包装了 require ,它知道在完成后自动解决它 - 所以我不需要在每个测试中手动推送和解决。
然后在我的幻像文件中我这样做:
page.evaluate ->
mylistener = ( document ) -> jasmine.getEnv().execute();
document.addEventListener( 'test_ready_event', mylistener, false);
这使得我知道我所有的 require 模块都被加载了,而setTimeout
一旦我加载了太多文件,就没有一些可能太短的任意模块。我正在使用的那个setTimeout
是安全的,因为它只在主调用堆栈完成后被用来触发。它并不真正关心时间。