我像这样运行jasmine测试;
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
jasmine.getEnv().execute();
我想使用JavaScript检测测试何时完成。我该如何做?
我像这样运行jasmine测试;
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
jasmine.getEnv().execute();
我想使用JavaScript检测测试何时完成。我该如何做?
如@Xv所建议的,添加一个报告人会起作用。您可以做一些简单的事情:
jasmine.getEnv().addReporter({
jasmineDone: function () {
// the specs have finished!
}
});
一些替代方法:
A) 使用接受 onComplete
选项的 ConsoleRunner
。旧版本(1.2rc1)将完整回调作为独立参数接收。
由于您还提供编写函数 (options.print
),因此您可以控制将测试报告写入控制台的方式。
您可以同时有多个报告器处于活动状态 jasmineEnv.addReporter()
。
B) 没有尝试过,但您可以创建自己的报告器,其中包含每个公共方法的空实现,但不包括 jasmineDone()
。
C) 检查 Jasmine 谷歌组中的一个旧帖子,在那里作者保存并覆盖了 jasmine.getEnv().currentRunner().finishCallback
:
var oldCallback = jasmineEnv.currentRunner().finishCallback;
jasmineEnv.currentRunner().finishCallback = function () {
oldCallback.apply(this, arguments);
$("body").append( "<div id='_test_complete_signal_'></div" );
};
jasmineEnv.execute();
我发现了两种解决此问题的方法。其中一种是通过黑客手段修改jasmine,使其在完成后抛出自定义事件。由于我希望在测试加载后进行屏幕抓取,因此我将事件触发器插入到"reportRunnerResults"的结尾处jasmine-html.js中。
$( 'body' ).trigger( "jasmine:complete" );
$( 'body' ).bind("jasmine:complete", function(e) { ... }
$(window.parent).find('body').trigger("jasmine:complete");
不使用jQuery也可以实现此功能。我的策略是轮询“finished-at” span元素中的文本内容。在此示例中,我每隔0.5秒轮询8秒。
var counter = 0;
function checkdone() {
if ( $('#test-frame' ).contents().find('span.finished-at').text().length > 0) {
...
clearInterval(timer);
} else {
counter += 500;
if (counter > 8000) {
...
clearInterval(timer);
}
}
}
var timer = setInterval( "checkdone()", 500 );
我正在使用带有HtmlReporter的Jasmine 1.3.1。最终,我是这样连接的:
var orig_done = jasmineEnv.currentRunner_.finishCallback;
jasmineEnv.currentRunner_.finishCallback = function() {
orig_done.call(this);
// custom code here
};