Ruby on rails 在前端运行集成/验收测试。前端需要一个API来告诉Rails为每个测试设置哪个数据库状态
我的前端是一个基于EmberJS的应用程序。它本质上是完全异步的,所以用水豚来测试它是非常困难的。另一方面,Ember提供了一个非常棒的开箱即用的测试套件,使验收测试变得有趣和有效 通常,fixture或后端mock用于验收测试余烬应用程序。但针对模拟的测试根本不能让我满意:Ruby on rails 在前端运行集成/验收测试。前端需要一个API来告诉Rails为每个测试设置哪个数据库状态,ruby-on-rails,integration-testing,factory-bot,acceptance-testing,database-cleaner,Ruby On Rails,Integration Testing,Factory Bot,Acceptance Testing,Database Cleaner,我的前端是一个基于EmberJS的应用程序。它本质上是完全异步的,所以用水豚来测试它是非常困难的。另一方面,Ember提供了一个非常棒的开箱即用的测试套件,使验收测试变得有趣和有效 通常,fixture或后端mock用于验收测试余烬应用程序。但针对模拟的测试根本不能让我满意: 它不会揭示后端和前端之间可能存在的API不一致、竞争条件等 以这种方式测试后端业务逻辑是不可能的。此类测试不是集成测试 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为。这是非常乏味的,并且您实际上最终实现了两个
- 它不会揭示后端和前端之间可能存在的API不一致、竞争条件等
- 以这种方式测试后端业务逻辑是不可能的。此类测试不是集成测试
- 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为。这是非常乏味的,并且您实际上最终实现了两个后端
- 该API仅在Rails使用特定标志或环境变量运行时可用
- Rails以非测试模式运行,像在生产环境中一样为普通API调用提供服务
- 在每次测试之前,前端调用特殊的API,告诉Rails此特定测试需要哪个数据库设置
- 当接收到对特殊API的调用时,Rails会清理数据库并用请求的数据填充它。例如,要测试从购物车中删除项目,数据库购物车中应该有三个项目
- Rails完成API请求,前端开始测试
- 前端使用正常的后端API运行测试步骤,就像在生产中一样:登录、创建帖子、对它们进行评论。它也会尝试做一些被禁止的事情,例如。G在未登录时编辑帖子、超出文本长度限制等,并验证后端是否拒绝禁止的操作
- 当前端运行下一个测试时,它将再次调用特殊的API。Rails将丢弃先前测试生成的状态,并为此特定测试设置一个新的状态
我相信这可以成为验收/集成测试的最佳实践。如果我能实现它,我保证会发布一个gem。可能是这样的 config/routes.rb
namespace 'test_api' do
resource 'db_transaction', only: [:create, :destroy]
end if Rails.env.test?
require 'database_cleaner'
def create
DatabaseCleaner.start
end
def destroy
DatabaseCleaner.clean
end
controllers/test\u api/db\u transactions\u controller.rb
namespace 'test_api' do
resource 'db_transaction', only: [:create, :destroy]
end if Rails.env.test?
require 'database_cleaner'
def create
DatabaseCleaner.start
end
def destroy
DatabaseCleaner.clean
end
也许并不是你想听到的,但我在使用capybara(在ember的测试套件之前)测试复杂的ember+rails时并没有遇到太大的困难。ember cli rails自述称“使用Cucumber之类的框架进行端到端测试应该可以正常工作”(这表明我并不孤单)。我真希望有一个简单的方法来问余烬“准备好了吗?”的各种行动。你有没有考虑过从这个角度来解决这个问题?如果你想这样做,我同意,可以使用FactoryGirl+DB Cleaner,或者构建一个sinatra应用程序,让你的测试发布来控制它们。确保它只在测试中起作用。我对水豚进行了一项研究,发现它是一个充斥着最肮脏的黑客和变通方法的世界。另外,我不想将测试保存在与它们控制的存储库不同的存储库中。使用API进行测试是一个有趣的想法,我看不到确切的问题需要回答。问题是如何在Rails端实现API,如何在RSpec环境之外使用FactoryGirl和DatabaseCleaner。我认为最好的选择是在测试环境
rails s-e test-p3005-P tmp/pids/server_test.pid
中启动服务器。(e->environment,P->pidfile以避免与默认开发服务器冲突,P->port以侦听)您可能还需要明确要求gems(如果您在Gemfile中有require:false
)