我正在使用phantomjs来进行茉莉花测试。我的jasmine测试在describe块周围使用require来确保加载所有正确的模块。
我的测试无法运行,因为page.evaluate -> jasmine.getEnv().execute();
在requirejs完成加载模块之前运行。
我想知道是否有人知道一个真正好的方法。我有一个答案,我将在下面发布,但很想通过其他答案比较笔记。如果你的更好,我会明确地选择它作为答案:)
答案 0 :(得分:3)
我做了一些不同的事情 - 我的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']);
答案 1 :(得分:2)
我的解决方案,有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 );
由您决定如何构建延迟数组然后解决它们。我基本上推到了数组,然后在需求完成时解决了。我用自己的版本包装需要知道自动完成后解决它 - 所以我不需要在每次测试中手动推送和解析。
然后在我的幻像文件中我这样做:
page.evaluate ->
mylistener = ( document ) -> jasmine.getEnv().execute();
document.addEventListener( 'test_ready_event', mylistener, false);
这使得我知道我加载了所有需要的模块而没有一些任意setTimeout
,一旦我加载太多文件就可能太短。我正在使用的那个setTimeout
是安全的,因为它只用于在主要的callstack完成后触发。它并不关心时间。