5

我使用 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'

编辑

我要搬到铁路由器上,所以任何答案都会有所帮助。

4

2 回答 2

0

Laika 现在包含一个waitForDOM()功能,您可以设置它来等待特定的 DOM 元素出现,在这种情况下,它是您正在加载的页面中的一个元素。

client.eval(function() {
    Router.go( 'test' );
    waitForDOM( 'h1', function() {
        var title = $('h1').text();
        emit( 'title', title ); 
    });
});

第一个参数是一个 jQuery 选择器。

于 2014-02-06T20:16:50.493 回答
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()此块之后的所有内容中,因此将在路由完成后执行。
希望这可以帮助。

于 2014-01-30T08:57:51.377 回答