setup和teardown不会重置控制器中的数组属性

时间:2014-09-17 09:41:37

标签: ember.js

我准备了一个显示Ember.js测试中的行为的short ember-cli project,我没有理解。

有一个simple controller

...
list: [],

actions: {
  add: function() {
   this.get('list').pushObject('a');
  }
}
...

template

<button id="btn" {{action 'add'}}>add a</button>
<span id="list">
{{#each item in list}}
  {{item}}
{{/each}}
</span>

two tests

...
test('test 1', function() {
  expect(1);

  visit('/');
  click('#btn');

  andThen(function() {
    ok(true);
  });
});

test('test 2', function() {
  expect(1);

  visit('/');
  click('#btn');

  andThen(function() {
    equal(find('#list').text().trim(), 'a');
  });
});
...

多次运行测试(http://localhost:4200/tests)。您会注意到“测试2”每秒都会失败。原因是,“测试1”设置的状态不会被设置或拆卸阶段清除。因此,在{test 2'中的list IndexController中有两个A.第一个由'test 1'添加,第二个由'test 2'添加。我希望通过测试设置的控制器上的任何状态在拆解和下一个设置阶段后都消失了......

我的问题是:为什么会发生这种情况,为什么“测试1”的状态会泄漏到“测试2”? this处理ember中的数组是错误的方法吗?这是ember中的错误吗?

1 个答案:

答案 0 :(得分:2)

简而言之,您将为控制器的所有实例提供相同的数组。这只是Javascript对象如何工作以及Ember如何创建类实例的一个怪癖。您可以通过为每个实例提供自己的数组对象来修复它。您可以通过在初始化期间显式设置值来实现。

export default Ember.Controller.extend({
    list: null,

    init: function() {
        this._super();
        this.set('list', []);
    }
});

现在,您的控制器的每个实例都将获得一个全新的阵列。