【发布时间】:2015-05-22 17:43:40
【问题描述】:
我的前端是一个基于 EmberJS 的应用程序。它本质上是完全异步的,所以用 Capybara 测试它是 pain 和 misery。另一方面,Ember 提供了一个开箱即用的出色测试套件,让验收测试变得有趣且有效。
通常,固定装置或后端模拟用于验收测试 Ember 应用程序。但是针对模拟的测试根本不能满足我:
- 它不会揭示后端和前端之间可能存在的 API 不一致、竞争条件等。
- 无法以这种方式测试后端业务逻辑。此类测试不是集成测试。
- 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为。这非常乏味,而且您实际上最终要实现两个后端。
所以我想针对真正的后端进行测试!将 Ember 设置为使用本地后端实例进行测试很简单。但问题在于后端会在各个测试甚至测试会话之间保持其状态。
这就是为什么我正在考虑在 Rails 中实现一个特殊的公共 API:
- 该 API 仅在使用特定标志或环境变量运行 Rails 时可用。
- Rails 以非测试模式运行,像在生产环境中一样提供正常的 API 调用。
- 在每次测试之前,前端都会调用特殊的 API,告诉 Rails 这个特定的测试需要哪些数据库设置。
- 当收到对特殊 API 的调用时,Rails 会清理数据库并用请求的数据填充它。例如,要测试从购物车中删除商品,数据库应该在购物车中有三件商品。
- Rails 完成 API 请求,前端开始测试。
- 前端运行测试步骤,使用正常的后端 API,就像在生产中一样:登录、创建帖子、评论它们。它还会尝试做一些被禁止的事情,例如。 G。在未登录的情况下编辑帖子、超出文本长度限制等,并验证后端是否拒绝禁止的操作。
- 当前端运行下一个测试时,它会再次调用特殊的API。 Rails 将丢弃前一个测试产生的状态,并为这个特定的测试设置一个新的状态。
我是一名前端开发人员,对 Rails 有粗略的了解。 Factory Girl 和 Database 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