通过访问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
...使用PhantomJs以无头模式运行ember应用程序,但应用程序无法访问API,导致大多数测试失败。
即使我在开始运行测试时让服务器保持运行,也会发生同样的事情。
我理解在测试中自己模拟API请求是常规的, 起诉像Sinon或者mockjax这样的东西。 但是,这会复制我在测试服务器中已有的内容,我想避免这种情况。 有没有办法让测试在CI模式下运行(使用testem), 并可以访问我的测试服务器?
答案 0 :(得分:2)
这是可能的,但根据您的项目,它可能有点涉及。
您可以做的是并行运行ember服务器进行ember测试。然后,您需要更改ember数据适配器和/或其他AJAX调用的主机设置(可能使其在environment.js中可配置)。
应用程序本身仍由testem服务器提供服务,这使得AJAX调用跨域(因为端口不同,即使两者都作为localhost访问)。
然后,您需要在服务器上启用CORS。有一个npm包cors
可用作快速服务器中的中间件。
在一个简单的例子中,添加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());
// ...
答案 1 :(得分:0)
这个问题涉及到ember-cli:https://github.com/ember-cli/ember-cli/issues/1763;有一个PR正在等待解决它:https://github.com/ember-cli/ember-cli/pull/2969
答案 2 :(得分:0)
看看https://github.com/samselikoff/ember-cli-mirage。它在内部使用pretender,可以同时用于app和测试同一数据。
我们最近从 http-mocks + Pretender 组合切换到ember-cli-mirage
,看起来很有希望。