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

标签 ruby-on-rails integration-testing factory-bot acceptance-testing database-cleaner

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

通常,夹具或后端模拟用于验收测试 Ember 应用程序。但是针对模拟的测试根本不能满足我:

  • 它不会揭示后端和前端之间可能存在的 API 不一致、竞争条件等。
  • 以这种方式测试后端业务逻辑是不可能的。这样的测试不是集成测试。
  • 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为。这非常乏味,并且您实际上最终实现了两个后端。

  • 所以我想测试真正的后端!将 Ember 设置为使用本地后端实例进行测试很简单。但是问题是后端将在单个测试甚至测试 session 之间保持其状态 .

    这就是为什么我正在考虑在 Rails 中实现一个特殊的公共(public) API:
  • 该 API 仅在使用特定标志或 env var 运行 Rails 时可用。
  • Rails 以非测试模式运行,像在生产环境中一样提供正常的 API 调用。
  • 在每次测试之前,前端都会调用特殊的 API,告诉 Rails 这个特定的测试需要哪些数据库设置。
  • 当收到对特殊 API 的调用时,Rails 会清理数据库并用请求的数据填充它。例如,要测试从购物车中删除商品,数据库应该在购物车中有三个商品。
  • Rails 完成 API 请求,前端开始测试。
  • 前端运行测试步骤,使用正常的后端 API,就像在生产中一样:登录、创建帖子、评论它们。它还会尝试做一些被禁止的事情,例如。 G。在未登录的情况下编辑帖子,超过文本长度限制等,并验证后端是否拒绝被禁止的操作。
  • 当前端运行下一个测试时,它会再次调用特殊的 API。 Rails 将丢弃前一个测试产生的状态并为这个特定的测试设置一个新的状态。

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

    所以问题是:我如何在 Rails 中创建一个 API,前端可以使用它来告诉 Rails 使用夹具工厂设置某个数据库状态 , 而 Rails 在非测试模式下运行 i。 e.服务 REST API 而不是通过 RSpec/Capybara/Cucumber 运行?

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

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

    最佳答案

    可能是这样的

    配置/路由.rb

     namespace 'test_api' do
       resource 'db_transaction', only: [:create, :destroy]
     end if Rails.env.test?
    

    Controller /test_api/db_transactions_controller.rb
    require 'database_cleaner'
    def create
      DatabaseCleaner.start
    end
    
    def destroy
      DatabaseCleaner.clean
    end
    

    关于ruby-on-rails - 在前端运行集成/验收测试。前端需要一个 API 来告诉 Rails 为每个测试设置哪个数据库状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402853/

    相关文章:

    ruby-on-rails - Rails 将具有浮点值的字符串转换为整数

    ruby-on-rails - 具有枚举和关联的工厂女孩

    java - 我们可以在 Java 的 Maven 构建过程中进行 bash 测试吗?

    java - 在 Spring 上下文之前动态创建 schema.sql

    ruby-on-rails - FactoryGirl搞砸了 rake db:迁移过程

    ruby-on-rails - Rspec:测试嵌套销毁操作

    ruby-on-rails - rails + 载波 : How to link to file?

    mysql - ROR 无法远程连接到 MySQL DB

    ruby-on-rails - 参数缺失或值为空 : user rails 4

    ruby-on-rails - rails 在集成测试中设计经过身份验证的路由