如何通过phantomjs可靠地执行使用requirejs的Jasmine测试?

时间:2012-08-29 23:02:26

标签: javascript unit-testing jasmine phantomjs

我正在使用phantomjs来进行茉莉花测试。我的jasmine测试在describe块周围使用require来确保加载所有正确的模块。

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

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

2 个答案:

答案 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完成后触发。它并不关心时间。