gpt4 book ai didi

javascript - 我们如何使用 ember-cli 对模型混合进行单元测试

转载 作者:数据小太阳 更新时间:2023-10-29 06:15:06 25 4
gpt4 key购买 nike

我的应用程序中几乎没有 Ember.Mixin 包含 DS.attr() 和/或 DS.belongsTo()。我想知道我应该如何对它们进行单元测试?

默认情况下,ember-cli 生成这个测试

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

但是当我尝试与 DS.attr() 交互时,出现以下错误:

TypeError: Cannot read property '_attributes' of undefined
at hasValue (http://localhost:4200/assets/vendor.js:90650:25)
at Class.get (http://localhost:4200/assets/vendor.js:90730:13)
at Descriptor.ComputedPropertyPrototype.get (http://localhost:4200/assets/vendor.js:29706:28)
at Object.get (http://localhost:4200/assets/vendor.js:35358:19)
at Class.get (http://localhost:4200/assets/vendor.js:49734:38)
at Object.<anonymous> (http://localhost:4200/assets/tests.js:20126:25)
at runTest (http://localhost:4200/assets/test-support.js:2779:28)
at Object.run (http://localhost:4200/assets/test-support.js:2764:4)
at http://localhost:4200/assets/test-support.js:2906:11
at process (http://localhost:4200/assets/test-support.js:2565:24)

这是有道理的。最好的方法是什么?我应该在测试中创建一个 DS.Model 然后在其上应用 mixin 吗?

谢谢!

最佳答案

像这样对模型混合进行单元测试有点棘手,因为它需要访问商店才能创建模型。通常,store 在 mixin 测试中不可用,因为甚至没有容器。此外,由于我们只是想测试 mixin,我们不想要求 真实 模型,因此我们可以创建并注册一个仅用于测试的假主机模型。这是我的做法。

首先,引入“ember-data”并使用“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() 来获取用于测试的对象。

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

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

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);
});
});

关于javascript - 我们如何使用 ember-cli 对模型混合进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39594724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com