通常,夹具或后端模拟都用于验收Ember应用程序.但是,针对嘲笑的测试根本不能满足我的需求:
>它不会显示后端和前端之间的API不一致,竞争条件等.
>以这种方式测试后端业务逻辑是不可能的.这些测试不是集成测试.
>最后,验收测试需要持久性,所以你必须在模拟中复制后端行为.这是非常乏味的,你有效地最终实现两个后端.
所以我想测试反对真正的后端!将Ember设置为使用本地后端实例进行测试是微不足道的.但问题是后端将在各个测试之间持续其状态甚至测试会话.
这就是为什么我正在考虑在Rails中实现一个特殊的公共API:
>仅当使用特定标志或env var运行Rails时,API才可用.
> Rails运行在非测试模式下,正常运行在正常的API调用中.
>在每次测试之前,前端调用特殊API,告诉Rails需要哪个数据库进行此特定测试.
>当接收到对特殊API的调用时,Rails清理数据库并使用所请求的数据填充数据.例如,要从购物车中测试项目删除,数据库应该在购物车中有三个项目.
> Rails完成API请求,前端开始测试.
>前端运行测试步骤,使用正常的后端API,如在生产中:登录,创建帖子,对它们发表评论.它也会尝试做一些禁止的事情,例如G.编辑帖子而不登录,超过文本长度限制等,并验证后端是否拒绝禁止的操作.
>当前端运行下一个测试时,它将再次调用特殊的API. Rails将丢弃以前测试所产生的状态并设置新的状态,用于此特定测试.
我是一个前沿开发者,具有粗略的Rails知识. Factory Girl和Database Cleaner似乎是工作的正确工具,但绝对没有信息如何在Rails正常测试环境之外使用它们.我想我需要一个控制器或一个Rails引擎或某些东西.
所以问题是:如何在Rails中使用可以由前端使用的API来告诉Rails使用fixture工厂设置某个数据库状态,而Rails是以非测试模式运行的.即提供REST API并且不通过RSpec / Capybara / Cucumber运行?
奖励功能:灯具工厂属性应在前端定义,以便测试代码存储在一个地方.因此,后端应该能够通过特殊的API接受夹具工厂属性.仍可以在后台的代码库中定义默认值.
我相信这可能成为接受/集成测试的最佳实践.如果我设法实现它,我保证发布一个宝石.
解决方法
配置/ routes.rb中
namespace 'test_api' do resource 'db_transaction',only: [:create,:destroy] end if Rails.env.test?
控制器/ test_api / db_transactions_controller.rb
require 'database_cleaner' def create DatabaseCleaner.start end def destroy DatabaseCleaner.clean end