我正试图利用ember应用工具包中提供的api存根进行测试。
当我在浏览器中查看网站时,以及当我通过在浏览器中访问/tests
来运行测试时,存根都能正常工作。
但是,当我使用testem从命令行运行测试时(通过运行grunt test:server
),测试失败,因为没有返回存根数据。
您可以在这里找到一个演示该问题的最小示例:https://github.com/tomclose/minimal_eak_testrongtub_problem,从最新版本的ember应用工具包创建。
我做错了什么?
rstudner在irc上联系了我,并帮助我解决了这个问题。基本思想是保持grunt server
运行,并使用config/environments/test.js
配置测试api请求以访问该服务器。
以下是行之有效的方法:
-
将
app/adapters/application.js
更改为指向可配置主机:export default DS.RESTAdapter.extend({ namespace: 'api', host: window.ENV.host });
-
编辑
config/environments/test.js
以配置测试以命中以grunt server
:运行的应用程序实例window.ENV.host = 'http://localhost:8000'
-
然后你会遇到CORS问题。要解决这些问题,请将依赖项
"cors": "2.2.0",
添加到package.json
,然后运行npm install
。然后 -
在
tasks/express-server.js
的第8行添加:var cors = require('cors');
在第25行添加:
app.use(cors());
您可以在上找到更新的工作版本https://github.com/tomclose/minimal_eak_testrongtub_problem.
rstudner还提到,他实际上100%使用sinon.js
来伪造服务器(然后在一些全栈测试中使用selenium),而不是遵循这种方法。
因为testem的东西在端口(7239是吗?)上运行,所以你a)不能在同一个端口(已经绑定)上运行apistub服务器。
因此,您必须运行普通的应用程序(端口8000),让testem在自己的端口上运行。并允许testem通过适配器中的"host"参数找到正确的host:port组合来实际获取数据。
此外,cors()过滤器的添加将使:8000测试服务器愿意将数据从7239 端口发送回"跨域请求"
使用sinon是另一种情况(根本不想使用apistub)。事实上,我决定不尝试使用apistub进行测试,但上面的方法确实很有效。