组件在测试期间无法正确渲染

时间:2015-02-04 22:21:10

标签: ember.js ember-cli ember-qunit

我正在为我的Ember CLI应用程序编写集成测试,我的一次测试每次都失败了。这是我目前的测试:

// tests/integration/project-test.js
test('displays "Projects" when the user views a project from Collaborate', function() {
  visit('/collaborate');

  click('.table > tbody > tr > td > a'); // it goes to /collaborate/projects/:id
  expect(0);
});

当它导航到/collaborate/projects/:id时,我收到错误"无法读取属性' setLegend' null。"我将其追溯到我的组件:

// app/components/foo-comp.js
import Ember from "ember";

export default Ember.Component.extend({
  fooObject: null,
  didInsertElement: function () {
    var foo = new Foo();

    this.set('fooObject', foo);
    Ember.run.once(this, 'updateChart');
  },
  updateChart: function () {
    var foo = this.get('fooObject');
    foo.setLegend(); // this is where the error comes from
  }.observes('data','fooObject')
});

请注意,如果我将updateChart更改为:

,测试确实会通过
updateChart: function () {
  var foo = this.get('fooObject');

  if (foo) {
    foo.setLegend();
  }
}.observes('data','fooObject')

为什么在测试期间不设置该变量?它在开发和生产中都很好用,所以我不确定为什么会这样。我假设它是因为didInsertElement在测试运行时没有被触发。思考?想法?

Ember版本:

version: 0.1.12
node: 0.10.33
npm: 2.1.8

修改

可能是Foo()来自外部模块吗?也许测试无法访问它,因此无法将其添加到页面中?我对此表示怀疑,并且我已经尝试将其添加到.jshintrc,但我认为它仍然可以与此相关。我还在运行测试时控制了记录Foo,它确实显示在控制台中。

老实说,它可能与将其插入DOM有关。我在初始化其他组件方面遇到了问题,因此didInsertElement可能与我的思维方式不同。

1 个答案:

答案 0 :(得分:0)

嗯,也许你的测试不等待一切都要加载?

我不确定,但您可以尝试:

test('displays "Projects" when the user views a project from Collaborate', function() {
  expect(0);
  visit('/collaborate');
  andThen(function() {
    click('.table > tbody > tr > td > a');
  });
});