在前端运行集成/验收测试.需要一个前端API来告诉Rails为每个测试设置哪个数据库状态

And*_*aus 14 integration-testing ruby-on-rails acceptance-testing database-cleaner factory-bot

我的前端是一个基于EmberJS的应用程序.它本质上是完全异步的,所以用Capybara测试它是痛苦痛苦.另一方面,Ember提供了一个开箱即用的优秀测试套件,使验收测试变得有趣和有效.

通常情况下,使用固定装置或后端模拟验收Ember应用程序.但是对模拟的测试并不能让我满意:

  • 它不会揭示后端和前端之间可能的API不一致,竞争条件等.
  • 以这种方式测试后端业务逻辑是不可能的.这些测试不是集成测试.
  • 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为.这非常繁琐,你有效地最终实现了两个后端.

所以我想测试真正的后端!设置Ember以使用本地后端实例进行测试是微不足道的.但问题是后端将在各个测试甚至测试会话之间保持其状态.

这就是为什么我想在Rails中实现一个特殊的公共API:

  • 只有在使用特定标志或env var运行Rails时,API才可用.
  • Rails以非测试模式运行,提供正常的API调用,就像在生产中一样.
  • 在每次测试之前,前端调用特殊API,告诉Rails这个特定测试需要哪个数据库设置.
  • 当收到对特殊API的调用时,Rails会清理数据库并使用请求的数据填充它.例如,要从购物车中测试项目删除,数据库应该在购物车中有三个项目.
  • Rails完成API请求,前端开始测试.
  • 前端运行测试步骤,使用正常的后端API,就像在生产中一样:登录,创建帖子,评论它们.它还会尝试做一些禁止的事情,例如在未登录时编辑帖子,超出文本长度限制等,并验证后端是否拒绝禁止的操作.
  • 当前端运行下一个测试时,它将再次调用特殊API.对于此特定测试,Rails将丢弃先前测试产生的状态并设置新测试状态.

我是一个对Rails有粗略了解的前端开发人员.Factory GirlDatabase Cleaner似乎是适合这项工作的工具,但绝对没有关于如何在Rails正常测试环境之外使用它们的信息.我想我需要一个控制器或一个Rails引擎.

所以问题是:如何在Rails中创建一个API,前端可以使用它来告诉Rails使用fixture工厂设置某个数据库状态,而Rails则以非测试模式运行,即提供REST API和没有通过RSpec/Capybara/Cucumber运行?

额外功能:应在前端定义夹具工厂属性,以便将测试代码存储在一个位置.因此,后端应该能够通过特殊API接受夹具工厂属性.默认值仍然可以在后端的代码库中定义.

我相信这可能成为验收/集成测试的最佳实践.如果我设法实现它,我保证发布一个gem.

far*_*ron 1

可能是这样的

配置/routes.rb

 namespace 'test_api' do
   resource 'db_transaction', only: [:create, :destroy]
 end if Rails.env.test?
Run Code Online (Sandbox Code Playgroud)

控制器/test_api/db_transactions_controller.rb

require 'database_cleaner'
def create
  DatabaseCleaner.start
end

def destroy
  DatabaseCleaner.clean
end
Run Code Online (Sandbox Code Playgroud)