Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在前端运行集成/验收测试。前端需要一个API来告诉Rails为每个测试设置哪个数据库状态_Ruby On Rails_Integration Testing_Factory Bot_Acceptance Testing_Database Cleaner - Fatal编程技术网

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

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不一致、竞争条件等 以这种方式测试后端业务逻辑是不可能的。此类测试不是集成测试 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为。这是非常乏味的,并且您实际上最终实现了两个

我的前端是一个基于EmberJS的应用程序。它本质上是完全异步的,所以用水豚来测试它是非常困难的。另一方面,Ember提供了一个非常棒的开箱即用的测试套件,使验收测试变得有趣和有效

通常,fixture或后端mock用于验收测试余烬应用程序。但针对模拟的测试根本不能让我满意:

  • 它不会揭示后端和前端之间可能存在的API不一致、竞争条件等
  • 以这种方式测试后端业务逻辑是不可能的。此类测试不是集成测试
  • 最后,验收测试需要持久性,因此您必须在模拟中复制后端行为。这是非常乏味的,并且您实际上最终实现了两个后端
所以我想测试真正的后端!设置Ember以使用本地后端实例进行测试是很简单的。但是问题是后端将在单个测试甚至测试会话之间保持其状态

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

  • 该API仅在Rails使用特定标志或环境变量运行时可用
  • Rails以非测试模式运行,像在生产环境中一样为普通API调用提供服务
  • 在每次测试之前,前端调用特殊的API,告诉Rails此特定测试需要哪个数据库设置
  • 当接收到对特殊API的调用时,Rails会清理数据库并用请求的数据填充它。例如,要测试从购物车中删除项目,数据库购物车中应该有三个项目
  • Rails完成API请求,前端开始测试
  • 前端使用正常的后端API运行测试步骤,就像在生产中一样:登录、创建帖子、对它们进行评论。它也会尝试做一些被禁止的事情,例如。G在未登录时编辑帖子、超出文本长度限制等,并验证后端是否拒绝禁止的操作
  • 当前端运行下一个测试时,它将再次调用特殊的API。Rails将丢弃先前测试生成的状态,并为此特定测试设置一个新的状态
我是一名前端开发人员,对Rails略知一二。而且似乎是完成这项工作的合适工具,但是在Rails的正常测试环境之外,绝对没有关于如何使用它们的信息。我想我需要一个控制器或者Rails引擎之类的东西

因此,问题是:当Rails以非测试模式I运行时,如何在Rails中创建一个API,前端可以使用该API告诉Rails使用夹具工厂设置特定的数据库状态。E提供RESTAPI而不通过RSpec/Capybara/Cucumber运行

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


我相信这可以成为验收/集成测试的最佳实践。如果我能实现它,我保证会发布一个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