ember-旧版应用中的 cli-mirage

ember-cli-mirage in legacy app

我们有使用 Pretender to provide fixtures for tests. Now we're trying to migrate to ember-cli-mirage 的应用程序。我们不能一次迁移所有的固定装置。所以基本上发生的事情是我们正在启动我们自己的 Pretender 服务器,而 ember-cli-mirage 正在启动它自己的服务器。呈现以下警告:

You created a second Pretender instance while there was already one running. Running two Pretender servers at once will lead to unexpected results and will be removed entirely in a future major version.Please call .shutdown() on your instances when you no longer need them to respond.

既然只是警告,暂时应该不是问题。问题是一旦 Mirage 加载到我们的应用程序中,旧的 Pretender 路由就会停止响应。我想这就是“......会导致意想不到的结果”所指的。

是否有机会 运行 ember-cli-mirage 与手动创建的伪装路线一起?或者只是使用 Mirage 服务器并在那里注入那些路由?

我会使用 Mirage 的服务器,然后在其中加载您的 Pretender 路线。 (Mirage 的服务器实际上只是 new 建立 Pretender 实例的对象)。如果人们看到 mirage 文件夹,他们可能会期望路由在那里定义。此外,Mirage 会在测试期间清理其 Pretender 实例。

mirage/config.js 中,您可以导入现有的 Pretender 路由并在那里调用它们。 Mirage 在 Pretender 之上有糖分,但您始终可以通过 config 函数中的 this.pretender 访问底层的 pretender 实例:

// mirage/config.js
import setupYourOldRoutes from 'somewhere';

export default function() {
  this.get('users'); // new Mirage shorthand

  setupYourOldRoutes(this.pretender);
}

所以 setupYourOldRoutes 可以是一个函数,它接受伪装者实例,然后使用它定义所有现有的路由处理程序。

根据@samselikoff 的回答,我找到了适合我的案例的解决方案。我们已经有了一个中心点,那就是处理伪装者实例的创建。所以修复只是通过 Mirage 的伪装者而不是创建新的伪装者:

// somewhere.js
export default function () {
  // initPretender: function () {
  //   this.pretender = new Pretender();
  // }
  initPretender: function (pretender) {
    this.pretender = pretender;
  },
  getPretender: function () {
    return this.pretender;
  }
}

// mirage/config.js
import pretenderWrapper from 'somewhere';

export default function() {
  this.get('users'); // new Mirage shorthand

  pretenderWrapper.initPretender(this.pretender);
}

棘手的部分是确保 initPretender() 在 之前被调用 我们的任何遗留代码试图调用 getPretender()。我 认为 通常这不是问题。在我们的例子中,我们修补了 tests/helpers/start-app.js 以便在每个测试中注入一些固定装置。这导致过早调用 getPretender()