简体   繁体   English

遗留应用程序中的余烬

[英]ember-cli-mirage in legacy app

We have application that used Pretender to provide fixtures for tests. 我们有使用Pretender提供测试夹具的应用程序。 Now we're trying to migrate to ember-cli-mirage . 现在,我们正在尝试迁移到ember-cli-mirage We cannot migrate all the fixtures at once. 我们不能一次迁移所有的灯具。 So what is basically happening there is that we are starting our own Pretender server and ember-cli-mirage is starting it's own. 因此,基本上正在发生的是,我们正在启动自己的Pretender服务器,而ember-cli-mirage正在启动它自己的服务器。 Whic renders following warning: Whic提出以下警告:

You created a second Pretender instance while there was already one running. 您已经创建了第二个Pretender实例,而该实例已经在运行。 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. 同时运行两个Pretender服务器会导致意外结果,并将在以后的主要版本中完全删除。如果不再需要它们响应,请在实例上调用.shutdown()。

Since it is just a warning, it should not be an issue for the transient period. 由于这只是一个警告,因此在过渡时期不应该成为问题。 Problem is that once Mirage is loaded into our application, old Pretender routes stops responding. 问题是,一旦Mirage加载到我们的应用程序中,旧的Pretender路由就会停止响应。 I guess that's what "... will lead to unexpected results" is referring to. 我想这就是“ ...将导致意外结果”的意思。

Any chance to run ember-cli-mirage alongside manually created Pretender routes? 有机会与人工创建的Pretender路线一起运行ember-cli-mirage吗? Or just to use Mirage server and inject those routes there? 还是仅使用Mirage服务器并将那些路由注入那里?

I would use Mirage's server and then load up your Pretender routes inside of it. 我会使用Mirage的服务器,然后在其中加载您的Pretender路由。 (Mirage's server is really just an object that new s up a Pretender instance). (Mirage的服务器实际上只是一个new的Pretender实例的对象)。 If folks see mirage folder they'd probably expect the routes to be defined there. 如果人们看到mirage文件夹,他们可能希望在其中定义路线。 Also, Mirage cleans up its Pretender instance during testing. 此外,Mirage在测试期间会清理其Pretender实例。

In mirage/config.js you could import your existing Pretender routes and call them there. mirage/config.js您可以导入现有的Pretender路由并在其中调用它们。 Mirage has sugar on top of Pretender but you can always access the underlying pretender instance via this.pretender within the config function: 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);
}

So setupYourOldRoutes could be a function that takes a pretender instance and then defines all your existing route handlers using it. 所以setupYourOldRoutes可以是一个函数,它带有一个伪装实例,然后使用该实例定义所有现有的路由处理程序。

Based on @samselikoff answer I found a solution for my case. 基于@samselikoff答案,我找到了针对我的案例的解决方案。 We already have one central point, that is handling creation of pretender instance. 我们已经有一个中心点,即处理假装实例的创建。 So the fix was just to pass Mirage's Pretender instead of creating new one: 因此解决方法是通过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);
}

Tricky part was to make sure that initPretender() is called before any of our legacy code tries to call getPretender() . 棘手的部分是确保initPretender()被调用我们的任何遗留代码试图调用之前 getPretender() I think usually that is not a trouble. 认为通常这不是麻烦。 In our case we patched tests/helpers/start-app.js so that some fixtures were injected in every test. 在我们的案例中,我们修补了tests/helpers/start-app.js以便在每次测试中注入一些固定装置。 And that caused calling getPretender() too early. 这导致调用getPretender()太早。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM