单元测试Model Mixin

ken*_*ken 7 ember.js ember-data

我正在尝试为一个与模型一起使用的Mixin做一个基本的"it ​​works"测试.我假设单元测试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);
});
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Cha*_*had 1

通常lookup需要一个容器,这样就可以暗示我认为是什么导致了问题。这是有道理的,因为DS依赖容器能够在 处查找注册模型model:model-name

\n\n

因此,您对该 mixin 的测试依赖实际上取决于正确设置的 Ember 数据。因此,如果您进行测试以使其适用于 Ember 数据模型,则 mixin 或多或少会按照其预期的方式与对象设置就位。

\n\n

我想说尝试使用moduleForModel, 来自有用的Ember 文档

\n\n
moduleForModel(\'dictionary-manager-model\');\n\ntest(\'your test here\', function(assert) {\n    // this.subject aliases the createRecord method on the model\n    const dictionaryManagerModel = this.subject();\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

https://github.com/emberjs/data/blob/v2.14.10/addon/-private/system/store.js#L351 \nassert(将类传递给存储方法已被删除。请传递破折号字符串而不是 ${modelName}, typeof modelName === \'string\');\n这就是我们依赖容器查找的原因。

\n\n

本质上,我认为您是在进行模型测试,而不是混合测试。除非 mixin 可以被卷入非模型的东西并且仍然可以工作。

\n\n

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

\n\n

希望这能让您朝着正确的方向开始,干杯!\xe2\x9c\x8c

\n