我们如何使用ember-cli对Model Mixin进行单元测试

时间:2016-09-20 12:56:24

标签: javascript unit-testing ember.js ember-data ember-cli

我的应用中包含constructor(props) { super(props); this.onScroll = this.onScroll.bind(this); } componentDidMount() { window.addEventListener('scroll', this.onScroll); } componentWillUnmount() { window.removeEventListener('scroll', this.onScroll); } onScroll(event) { //handle event here } 和/或Ember.Mixin的{​​{1}}很少。我想知道我应该如何对它们进行单元测试?

默认情况下,ember-cli会生成此测试

DS.attr()

但是当我尝试与DS.belongsTo()进行互动时,我收到了以下错误:

test('it works', function(assert) {
  var MyModelObject = Ember.Object.extend(MyModelMixin);
  var subject = MyModelObject.create();
  assert.ok(subject);
});

这让人感觉到了。最好的方法是什么?我应该在测试中创建DS.attr()然后在其上应用mixin吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

单元测试这样的模型mixin有点棘手,因为它需要访问商店才能创建模型。通常,商店在mixin测试中不可用,因为即使是容器也没有。此外,由于我们只想测试mixin,因此我们不想要真正的模型,因此我们可以为测试创建和注册虚假的主机模型。这是我如何做到的。

首先,拉入'余烬数据'并使用来自' ember-qunit'的帮助者而不是来自' qunit'的股票帮助者。替换这个:

import { module, test } from 'qunit';

有了这个:

import { moduleFor, test } from 'ember-qunit';
import DS from 'ember-data';

然后,您更新模块声明:

moduleFor('mixin:my-model-mixin', 'Unit | Mixin | my model mixin', {
  // Everything in this object is available via `this` for every test.
  subject() {
    // The scope here is the module, so we have access to the registration stuff.
    // Define and register our phony host model.
    let MyModelMixinObject = DS.Model.extend(MyModelMixin);
    this.register('model:my-model-mixin-object', MyModelMixinObject);

    // Once our model is registered, we create it via the store in the
    // usual way and return it. Since createRecord is async, we need
    // an Ember.run.
    return Ember.run(() => {
      let store = Ember.getOwner(this).lookup('service:store');
      return store.createRecord('my-model-mixin-object', {});
    });
  }
});

完成此设置后,您可以在各个测试中使用this.subject()来获取测试对象。<​​/ p>

test('it exists', function(assert) {
  var subject = this.subject();
  assert.ok(subject);
});

此时,它只是一个标准的单元测试。您可能需要在Ember.run块中包装异步或计算代码:

test('it doubles the value', function(assert) {
  assert.expect(1);
  var subject = this.subject();
  Ember.run(() => {
    subject.set('someValue', 20);
    assert.equal(subject.get('twiceSomeValue'), 40);
  });
});