4

我正在使用 phantomjs 运行 jasmine 测试。我的 jasmine 测试在 describe 块周围使用 require 以确保加载所有正确的模块。

我的测试不会运行,因为page.evaluate -> jasmine.getEnv().execute();在 requirejs 完成加载模块之前运行。

我想知道是否有人知道解决这个问题的真正好方法。我有一个答案,我将在下面发布,但很想通过其他答案比较笔记。如果你的更好,我会明确选择它作为答案:)

4

2 回答 2

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']);

于 2012-09-09T16:37:35.647 回答
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 );

如何构建延迟数组然后解决它们取决于您。我基本上推到了数组,然后在要求完成后解决。我用我自己的版本包装了 require ,它知道在完成后自动解决它 - 所以我不需要在每个测试中手动推送和解决。

然后在我的幻像文件中我这样做:

page.evaluate ->
    mylistener = ( document ) -> jasmine.getEnv().execute();
    document.addEventListener( 'test_ready_event', mylistener, false);

这使得我知道我所有的 require 模块都被加载了,而setTimeout一旦我加载了太多文件,就没有一些可能太短的任意模块。我正在使用的那个setTimeout是安全的,因为它只在主调用堆栈完成后被用来触发。它并不真正关心时间。

于 2012-08-29T23:10:26.173 回答