我正在使用laika进行测试,并使用meteor-router包进行路由。我想做一些导航到某个页面的测试,填写一个表单,提交它并检查成功消息,但我仍然坚持导航部分。这是我的第一次尝试:
var assert = require('assert');
suite('Router', function() {
test('navigate', function(done, server, client) {
client.eval(function() {
Meteor.Router.to('test');
var title = $('h1').text();
emit('title', title);
})
.once('title', function(title) {
assert.equal(title, 'Test');
done();
});
});
});
这不起作用,因为Meteor.Router.to
没有回调,我不知道如何在加载新页面时执行下一行。
我也试过这样的事情
var page = require('webpage').create();
page.open('http://localhost:3000/test', function () {
...
}
但我收到错误Error: Cannot find module 'webpage'
修改
我正在转移到iron router,所以任何答案都会有所帮助。
答案 0 :(得分:0)
我遇到了同样的问题。在运行测试之前,我需要导航到某个页面。我也在使用铁路由器。我想你不能只执行Router.go('foo')
而且就是这样。您需要等到实际路由发生。幸运的是,路由器公开了一个方法Router.current()
,这是一个被动数据源,一旦页面准备就会发生变化。因此,为了在运行测试之前导航到特定路由,我首先运行以下代码块:
// route to /some/path
client.evalSync(function() {
// react on route change
Deps.autorun(function() {
if (Router.current().path == '/some/path') {
emit('return');
this.stop();
}
});
Router.go('/some/path');
});
由于这是在evalSync()
之后的所有内容,因此在路由完成后将执行此块
希望这会有所帮助。
答案 1 :(得分:0)
Laika现在包含一个waitForDOM()
函数,您可以将其设置为等待特定DOM元素出现,在这种情况下,它将是您正在加载的页面中的元素。
client.eval(function() {
Router.go( 'test' );
waitForDOM( 'h1', function() {
var title = $('h1').text();
emit( 'title', title );
});
});
第一个参数是jQuery选择器。