在路径更改时使用过滤器时未呈现路径模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在路径更改时使用过滤器时未呈现路径模型相关的知识,希望对你有一定的参考价值。

我正在尝试在新的应用程序上设置海市蜃楼进行测试。

human-cli:2.16.2

Amber-Cli-Mirage:0.4.0

我有一个虚拟测试,只是试图设置海市蜃楼并验证它是否正常工作。我会做类似的测试route.model()。使用海市蜃楼的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)

适用于开发/生产并使用真实服务器获取数据。

如果我不用海市蜃楼创建我的记录,也不例外。

看起来问题只发生在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返回一个承诺。尝试解决承诺并在.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以使错误更明确。

以上是关于在路径更改时使用过滤器时未呈现路径模型的主要内容,如果未能解决你的问题,请参考以下文章

Typescript 路径别名在运行时未正确解析

使用删除与隐藏时未调用自定义动画

ngmodel 更改时未触发角度日期过滤器

路由问题:尝试重新路由时未定义 this.context.router

使用 ajax 加载模板时未呈现脚本

D3为geojson添加路径但不添加topojson