1

通过访问在浏览器中运行测试时localhost:4200/tests,测试能够访问测试服务器 API。

但是,在 CI 模式下运行测试时(使用 testem),它们无法访问测试服务器 API。

有没有办法做到这一点?


细节

在使用 ember-cli 生成的项目中,您可以扩展它运行的服务器(NodeJs with Express)。请参阅 中的说明/server/index.js。运行此命令后:

ember serve

...此服务器在localhost:4200. 我已经这样做了,创建了一个服务器来响应localhost:4200/api在浏览应用程序时提供的所有 API 请求。

当我访问localhost:4200/tests在浏览器中运行的测试时,他们能够访问这些 API,并且运行没有任何问题。

但是,当我终止服务器并以 CI 模式 (testem) 运行测试时,使用以下命令:

ember test

... ember 应用程序使用 PhantomJs 在无头模式下运行,但该应用程序无法访问 API,导致大多数测试失败。

即使我在开始运行测试时让服务器保持运行,也会发生同样的事情。

我知道在测试本身中模拟 API 请求是惯例,起诉诸如 Sinon 或 mockjax 之类的东西。但是,这会重复我在测试服务器中已有的内容,我想避免这种情况。有没有办法让测试在 CI 模式下运行(使用 testem),并且可以访问我的测试服务器?

4

3 回答 3

2

这是可能的,但根据您的项目,它可能会有点涉及。

您可以做的是与 ember 测试并行运行 ember 服务器。然后,您需要更改 ember 数据适配器和/或其他 AJAX 调用的主机设置(可能在 environment.js 中使其可配置)。

应用程序本身仍然由 testem 服务器提供服务,这使得 AJAX 调用跨域(因为端口不同,即使两者都作为 localhost 访问)。

然后,您需要在服务器上启用 CORS。有一个 npm 包cors可以用作 express 服务器中的中间件。

在一个简单的情况下,添加 CORS 中间件可以开箱即用,但是如果您在 AJAX 调用中使用身份验证或自定义标头,则需要在客户端和服务器端进行更多配置。在这种情况下阅读 CORS。

这就是我的做法。

app/adapters/application.js

export default DS.RESTAdapter.extend({
    namespace: "api",
    host: Ember.ENV.serverURL || ""
});

server/index.js

var express    = require('express');
// ...
var cors       = require('cors');

module.exports = function(app) {
    app.use(bodyParser());
    app.use(cors());
// ...
于 2014-06-28T11:20:13.983 回答
0

看看https://github.com/samselikoff/ember-cli-mirage。它在内部使用伪装器,可以同时用于应用程序和测试,同时使用相同的数据。

我们最近从http-mocks + Pretender组合切换到ember-cli-mirage它看起来很有希望。

于 2015-04-21T07:03:35.350 回答
0

ember-cli 的这个问题涵盖了这一点:https ://github.com/ember-cli/ember-cli/issues/1763 ;有一个 PR 待修复:https ://github.com/ember-cli/ember-cli/pull/2969

于 2015-01-22T18:30:34.163 回答