14

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

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

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

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

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

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

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

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

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

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

4

1 回答 1

1

可能是这样的

配置/路由.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
于 2015-05-26T10:58:59.763 回答