单元测试Model Mixin

时间:2014-12-14 00:54:42

标签: ember.js ember-data

我试图做一个基本的"它有效"测试一个与模型一起使用的Mixin。我假设单元测试Mixin的方法不应该在Mixin本身上进行,而是在混合了这个Mixin的通用Model类中进行。

假设这个第一个假设/策略是有道理的,那么这就是我尝试做的事情:

import DS from 'ember-data';
import Ember from 'ember';
import DictionaryManagerMixin from 'trainer/mixins/dictionary-manager';

module('DictionaryManagerMixin');

test('it works', function() {
  var DictionaryManagerModel = DS.Model.extend(DictionaryManagerMixin, {
      title: DS.attr('string')
  });
  var myStore = DS.Store.create();
  var subject = myStore.createRecord(DictionaryManagerModel);
  ok(subject);
});

这不起作用,给出以下错误:

TypeError: Cannot read property 'lookup' of undefined
    at null.<anonymous> (http://localhost:4200/assets/vendor.js:95610:35)
    at Descriptor.ComputedPropertyPrototype.get (http://localhost:4200/assets/vendor.js:28466:25)
    at get (http://localhost:4200/assets/vendor.js:33944:21)
    at Ember.Object.extend.adapterFor (http://localhost:4200/assets/vendor.js:97005:27)
    at Ember.Object.extend._generateId (http://localhost:4200/assets/vendor.js:95682:28)
    at Ember.Object.extend.createRecord (http://localhost:4200/assets/vendor.js:95654:32)
    at Object.eval (trainer/tests/unit/mixins/dictionary-manager-test.js:17:28)
    at Object.Test.run (http://localhost:4200/assets/test-support.js:2632:18)
    at http://localhost:4200/assets/test-support.js:2719:10
    at process (http://localhost:4200/assets/test-support.js:2435:24)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

通常lookup需要一个容器,因此这暗示了我认为导致问题的原因。这是有道理的,因为DS依靠容器来查找model:model-name处注册的模型;

因此,您对此mixin的测试依赖性实际上是在正确设置Ember Data。因此,如果您进行了测试以使其适用于Ember Data模型,那么mixin或多或少只会随着对象的设置而落实到位。

我想尝试使用有用的Ember doc

中的moduleForModel
moduleForModel('dictionary-manager-model');

test('your test here', function(assert) {
    // this.subject aliases the createRecord method on the model
    const dictionaryManagerModel = this.subject();
});

您是否需要有条件地使用模型滚动混合物?如果您的模型始终使用mixin,您可以在模型定义文件中执行此操作,并按上面所示进行测试。在你的例子中,mixin被添加到模型中,模型被传递给createRecord`但是不鼓励这样做:

https://github.com/emberjs/data/blob/v2.14.10/addon/-private/system/store.js#L351 assert(已删除将类传递给存储方法。请传递一个dasherized字符串而不是$ {modelName} , typeof modelName === 'string'); ,这就是为什么我们依赖于容器上的查找。

基本上,我认为你是在进行模型测试,而不是mixin测试。除非mixin能够融入某种不是模型的东西并且仍然有用。

ember generate model-test dictionary-manager-model如果它还没有存在,那么你的模型文件已经混合了mixin。另外,也许这不是一个单独的混音?

希望这能让你开始朝着正确的方向前进,欢呼! ✌