【问题标题】:Running integration/acceptance tests on the frontend. Need an API for the frontend to tell Rails which database state to set up for each test在前端运行集成/验收测试。前端需要一个 API 来告诉 Rails 为每个测试设置哪个数据库状态
【发布时间】:2015-05-22 17:43:40
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 也许不是你想听到的,但我用 capybara 测试复杂的 ember+rails 并没有遇到什么困难(在 ember 的测试套件之前)。 ember-cli-rails README 说“使用像 Cucumber 这样的框架的端到端测试应该可以正常工作”(表明我并不孤单)。我真希望有一种简单的方法可以让 ember “准备好了吗?”用于各种操作。您是否考虑过从那个角度解决它?如果你想这样做,我同意,使用 FactoryGirl+DB Cleaner 并可能构建一个 sinatra 应用程序,你的测试 POST 来控制它们。确保它只在测试中有效。
  • 我对 Capybara 进行了研究,发现它是一个充满最恶劣的黑客和变通方法的世界。此外,我不想将测试保存在与他们控制的存储库不同的存储库中。
  • 使用 API 进行测试的有趣想法,我没有看到要回答的确切问题。
  • 问题是如何在Rails端实现API,如何在RSpec环境之外使用FactoryGirl和DatabaseCleaner。
  • 我认为最好的选择是在测试环境中启动服务器rails s -e test -p3005 -P tmp/pids/server_test.pid。 (e -> 环境,P -> pidfile 与默认开发服务器不冲突,p -> 要监听的端口)此外,您可能需要明确要求 gems(如果您在 Gemfile 中有 require: false

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


【解决方案1】:

可能是这样的

config/routes.rb

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

controllers/test_api/db_transactions_controller.rb

require 'database_cleaner'
def create
  DatabaseCleaner.start
end

def destroy
  DatabaseCleaner.clean
end

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多