市面上测试框架太错综复杂了。尤其是 Rails 程序用 angular 写了前段以后,发现以前 rails view 端的逻辑很多多挪到了 js 上去了。所以 js 的测试也变得必然了。
网上一查各种迷惑,jasmine, kama, phantomjs, protractor .... 各种名词。
然而现在所有的前段测试框架比如 jasmine + karma + phantonjs 都是完全脱离 rails 的。意思就是 Rails 的 assets pipeline, rails 的测试数据完全用不上了。angujarjs unit test 现在唯一找到比较好的方案就是用 jasmine-rails gem,可以用 coffeescript, headless, 以及浏览器上跑测试。在测试后端的时候,fixture data 也不能直接用到前段,必须再做一份给前端用作 api 返回结果。gon 也用不了了,要想办法用其他方法解决。有时候真相干脆用 capybara 直接继承测试搞定就好了。可是集成测试真心慢。有时候调试真心麻烦。 不知道有没有好心人介绍一下比较好用的可以在 rails 上用的前端测试最佳实践?
Javascript 用 phantonjs 实现一个 让前段或者测试程序员用 javascript 就能写出的测试。在测试服务器上跑一个 Rails 应用,然后通过弄一个 FixtureController 来进行数据准备,比如 /fixtures/load_users /fixtures/cleanup_database。
我觉得你现在遇到的难题应该和架构有关。
如果之前预测到 Angular 只是轻量级的使用,那么 jamine-rails 加 Capybara 加肉测应该够用了,因为前端逻辑不是很多。jasmine-rails 我之前用过,测一点点 backbone 的单元测试一点问题都没有,但复杂的前端就会觉得不够力。Capybara 我觉得尽量少用,因为太慢,而且 coupling 太高,除非是既复杂又重要的流程否则不用它。
如果预见前端有大量的逻辑,那么就最好不要使用 assets pipeline,而是前后端彻底分离,使用 Angular/Grunt 的体系来做前端的一切,包括发布、测试等等。这样的话后端直接用 request spec 或者 controller spec 测 API。简单明了。前端自己测自己的,和后端无关,拥抱一切 Angular 最佳实践比如 karma 等等。
你这个问题不是 Rails 独有的,基本上 web 程序的测试都得这么测. 无非就是 单元测试
集成测试/Acceptance Test 系统在真实部署情况下的白盒测试
其他可选方案 随着 nodejs 和 phontomjs 的兴起,可以使用更为简单实用的 js 来写 acceptance test case 来替代 selenium 的方案. 当然考虑到浏览器兼容性问题,还是推荐 selenium 结合几个主要的目标浏览器来跑。
测试用例特别是 acceptance test 的 cover 程度,需要根据团队实际的 confidence/comfortable level 来确定,否则的话是无底洞。
jasmine + karma + phantonjs 都是完全脱离 rails 的。意思就是 Rails 的 assets pipeline, rails 的测试数据完全用不上了。
不太明白这个,举个例子?
我也碰到了这种问题。目前想来,拆成两个项目会更好,如果你有时间折腾的话。
拆开大概面临的问题是,HTML, CSS, JavaScript 全部放前端项目。也就是说 bootstrap-sass 这样的东西不需要靠 Rails 来装了。带来的问题当然就是 asset pipeline 完全用不着了,所以你得用其他的方式来做它所提供的功能:
从长期来开,如果前端本来就很重,分开是个很好的选择,我觉得也是必须要走的一步。从此 Rails 可以更轻松。不需要 view 和 helper 了。测试到 Controller 层为止,不过还得加一层 Serializer,处理 JSON 数据。
我在想一个不用完全分开的过渡方案,大概就是 CSS 和 image 还是用 Rails 的 asset pipeline,先只把 JavaScript 分离出去。目前能够想到的方案:
缺点是 application.js 需要放到版本库中去,而且每次开发需要开一个 Rails server 和一个 Grunt 任务。这个方案相当于一个半吊子前端项目(只处理 JavaScript)和 Rails 项目的整合,只是平滑过渡用。
#7 楼 @darkbaby123 其实能完全拆成两个项目当然好。我们的项目一部分还是用 rails 的。暂时还没有拆开。就算实现一下,也要花很多功夫进去。
正好这两天也在琢磨这个事情。上网搜索了半天,找到了几个解决方案。
可以参考下这个项目:https://github.com/EmmanuelOga/simple-angular-rails-app
rails 和 angular 代码分开,开发、测试时通过 grunt-connect-proxy 插件代理访问。
这样测试也是分开的,rails 测试仍走 rspec,angular 走 karma。
不过,部署时 angular 的代码是直接放到./public 下的。