0

我知道这应该很简单,我只是没有做正确的事情,还没有找到可以模仿的例子,我想我也不完全理解应该在Ember.run()

这是我的组件代码:

import Ember from 'ember';
export default Ember.Component.extend({
  isGreen: function() {
    if (!status) { return ''; }
    return status.toUpperCase() === 'G';
  }.property('status')
});

我的组件模板:

<div class="btn-group" data-toggle="buttons">
  <label class="btn btn-green {{if isGreen 'active'}}">
    <input checked="checked" name="status" value="G" type="radio"/> Green
  </label>
  <label class="btn btn-yellow {{if isYellow 'active'}}">
      <input name="status" value="Y" type="radio"/> Yellow
  </label>
  <label class="btn btn-red {{if isRed 'active'}}">
      <input name="status" value="R" type="radio"/> Red
  </label>
</div>

在我的测试中:

test('status sets active class on the correct button', function(assert) {
  expect(3);
  var component = this.subject();

  //Green status
  Ember.run(function() {
    component.set('status', 'G');
  })
  equal(this.$().find('.btn-green.active').length, 1, 'When status is green, the green button has the active class');

我有三个这样的测试,一个针对三种不同状态中的每一个。如果我只有一个测试,我不需要为了通过测试而将包裹component.set()起来。Ember.run()但是,如果我有所有三个测试,我会得到这个错误:

您已经打开了测试模式,它禁用了运行循环的自动运行。您将需要在运行中包装任何具有异步副作用的代码

但是,如果我确实将每个component.set()调用都放在运行循环中,那么我的测试会由于equal断言期望 1 并得到 0 而失败。我确信这是由于我缺乏理解,但要么set()不是正在运行,否则组件会在断言中重新呈现,因此不知道 status 属性已设置。我已经阅读了一个小时的文档和谷歌搜索,但还没有找到解决方案(更有利的是,一个解释)。

4

1 回答 1

1

@torazaburo:Facepalm出于某种原因,测试在它只是一个时就通过了,我认为这可能是由于模板中的某些内容而导致的误报。但你当然是对的。

我应该一直在使用this.get(status). 新手错误!

于 2015-06-30T18:44:07.000 回答