如何在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
,看起来相当有前途。