如何在CI模式下运行时访问ember-cli服务器?

当通过访问localhost:4200/tests tests在浏览器中运行testing时,testing可以访问testing服务器API。

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

有没有办法做到这一点?


细节

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

 ember serve 

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

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

但是,当我杀死服务器,并在CI模式(testem)下运行testing时,使用以下命令:

 ember test 

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

即使我开始运行testing时,服务器仍在运行,也会发生同样的情况。

我明白,在testing本身内部嘲弄API请求是惯例,像Sinon或mockjax。 但是,这将重复我已经在我的testing服务器,我想避免这一点。 有没有办法使testing运行在CI模式(使用testem),并有权访问我的testing服务器?

这是可能的,但取决于你的项目,它可能有点涉及。

你可以做的是并行运行ember服务器来进行embertesting。 然后你需要改变你的ember数据适配器和/或其他AJAX调用的主机设置(也许可以在environment.js中configuration)。

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

然后您需要在服务器上启用CORS。 在快速服务器中有一个npm包cors中间件。

在一个简单的例子中,添加CORS中间件可以开箱即用,但是如果您在AJAX调用中使用身份validation或自定义标头,则需要在客户端和服务器端进行更多configuration。 在这种情况下阅读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()); // ... 

这个问题涵盖了这个问题的烬: https : //github.com/ember-cli/ember-cli/issues/1763 ; 有一个PR正在解决它: https : //github.com/ember-cli/ember-cli/pull/2969

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

我们最近从http-mocks +伪装组合改为ember-cli-mirage ,看起来相当有前途。