在路线更改上使用过滤器时未呈现路线模型
Route model not rendered when using filter on route change
我正在尝试在新应用程序上设置 Mirage 以进行测试。
ember-cli: 2.16.2
ember-cli-mirage: 0.4.0
我有一个模拟测试,只是想设置 Mirage 并验证它是否正常工作。
我会做类似测试 route.model()
的事情。
使用 mirage 的 JSONAPISerializer
,我的工厂和迁移模型中没有任何内容。
// models/trip.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
});
我的测试:
import {moduleFor, test} from 'ember-qunit';
import {startMirage} from 'frontend/initializers/ember-cli-mirage';
moduleFor('route:trips.index', 'Unit | Route | trips.index', {
needs: ['service:session', 'model:trip', 'adapter:application'],
beforeEach() {
this.server = startMirage();
},
afterEach() {
this.server.shutdown();
}
});
test('model', function (assert) {
let route = this.subject();
this.server.create('trip');
Ember.run(() => {
this.get('store').findAll('trip')
});
assert.ok(route);
});
我收到这个错误:
TypeError: Cannot read property 'push' of null
at Class._setupRelationshipsForModel (http://localhost:4200/assets/vendor.js:196482:36)
at Class._pushInternalModel (http://localhost:4200/assets/vendor.js:196473:10)
at http://localhost:4200/assets/vendor.js:196425:20
at Backburner.run (http://localhost:4200/assets/vendor.js:20213:36)
at Backburner.join (http://localhost:4200/assets/vendor.js:20222:33)
at Class._push (http://localhost:4200/assets/vendor.js:196397:50)
at http://localhost:4200/assets/vendor.js:192955:18
at tryCatcher (http://localhost:4200/assets/vendor.js:63559:21)
at invokeCallback (http://localhost:4200/assets/vendor.js:63737:33)
at publish (http://localhost:4200/assets/vendor.js:63723:9)
在 development/production 上工作正常并使用真实服务器获取数据。
如果我没有用海市蜃楼创造我的记录,也不例外。
看起来问题只发生在 Ember.run
删除 Ember.run
不会引发异常,但我需要它来正确测试(并避免像 You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in a run
这样的错误)...
store.findAll
returns一个承诺。尝试在 .then()
中解析承诺和 运行 你的断言
(忽略这不是测试路线的方法这一事实,但我知道您只是使用此测试来解决您的海市蜃楼设置问题)
正如@rstellar 在这里所建议的那样 https://github.com/samselikoff/ember-cli-mirage/issues/1220#issuecomment-350155703 一个可行的解决方案是在函数周围使用 async/await。
当我们试图在商店被销毁后建立关系时会发生这个问题。此解决方案将防止这种情况发生,直到函数结束。
这是工作代码:
import {moduleFor, test} from 'ember-qunit';
import wait from 'ember-test-helpers/wait'; // import wait from ember here
import {startMirage} from 'frontend/initializers/ember-cli-mirage';
moduleFor('route:trips.index', 'Unit | Route | trips.index', {
needs: ['service:session', 'model:trip', 'adapter:application'],
beforeEach() {
this.server = startMirage();
},
afterEach() {
this.server.shutdown();
}
});
test('model', async function (assert) { // Declare this function as async
let route = this.subject();
this.server.create('trip');
Ember.run(() => {
this.get('store').findAll('trip')
});
assert.ok(route);
await wait(); // The actual wait
});
已在 Ember 上公开 PR 以使错误更明确。
我正在尝试在新应用程序上设置 Mirage 以进行测试。
ember-cli: 2.16.2
ember-cli-mirage: 0.4.0
我有一个模拟测试,只是想设置 Mirage 并验证它是否正常工作。
我会做类似测试 route.model()
的事情。
使用 mirage 的 JSONAPISerializer
,我的工厂和迁移模型中没有任何内容。
// models/trip.js
import DS from 'ember-data';
export default DS.Model.extend({
name: DS.attr('string'),
});
我的测试:
import {moduleFor, test} from 'ember-qunit';
import {startMirage} from 'frontend/initializers/ember-cli-mirage';
moduleFor('route:trips.index', 'Unit | Route | trips.index', {
needs: ['service:session', 'model:trip', 'adapter:application'],
beforeEach() {
this.server = startMirage();
},
afterEach() {
this.server.shutdown();
}
});
test('model', function (assert) {
let route = this.subject();
this.server.create('trip');
Ember.run(() => {
this.get('store').findAll('trip')
});
assert.ok(route);
});
我收到这个错误:
TypeError: Cannot read property 'push' of null
at Class._setupRelationshipsForModel (http://localhost:4200/assets/vendor.js:196482:36)
at Class._pushInternalModel (http://localhost:4200/assets/vendor.js:196473:10)
at http://localhost:4200/assets/vendor.js:196425:20
at Backburner.run (http://localhost:4200/assets/vendor.js:20213:36)
at Backburner.join (http://localhost:4200/assets/vendor.js:20222:33)
at Class._push (http://localhost:4200/assets/vendor.js:196397:50)
at http://localhost:4200/assets/vendor.js:192955:18
at tryCatcher (http://localhost:4200/assets/vendor.js:63559:21)
at invokeCallback (http://localhost:4200/assets/vendor.js:63737:33)
at publish (http://localhost:4200/assets/vendor.js:63723:9)
在 development/production 上工作正常并使用真实服务器获取数据。
如果我没有用海市蜃楼创造我的记录,也不例外。
看起来问题只发生在 Ember.run
删除 Ember.run
不会引发异常,但我需要它来正确测试(并避免像 You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in a run
这样的错误)...
store.findAll
returns一个承诺。尝试在 .then()
(忽略这不是测试路线的方法这一事实,但我知道您只是使用此测试来解决您的海市蜃楼设置问题)
正如@rstellar 在这里所建议的那样 https://github.com/samselikoff/ember-cli-mirage/issues/1220#issuecomment-350155703 一个可行的解决方案是在函数周围使用 async/await。
当我们试图在商店被销毁后建立关系时会发生这个问题。此解决方案将防止这种情况发生,直到函数结束。
这是工作代码:
import {moduleFor, test} from 'ember-qunit';
import wait from 'ember-test-helpers/wait'; // import wait from ember here
import {startMirage} from 'frontend/initializers/ember-cli-mirage';
moduleFor('route:trips.index', 'Unit | Route | trips.index', {
needs: ['service:session', 'model:trip', 'adapter:application'],
beforeEach() {
this.server = startMirage();
},
afterEach() {
this.server.shutdown();
}
});
test('model', async function (assert) { // Declare this function as async
let route = this.subject();
this.server.create('trip');
Ember.run(() => {
this.get('store').findAll('trip')
});
assert.ok(route);
await wait(); // The actual wait
});
已在 Ember 上公开 PR 以使错误更明确。