【问题标题】:Running Rake tasks in Rspec Tests在 Rspec 测试中运行 Rake 任务
【发布时间】:2011-10-17 05:37:01
【问题描述】:

我正在构建一个集成测试套件,我需要一个干净的数据库来处理一些逻辑。如何在我的一项测试中运行 db:test:purge 任务?

我正在使用:ruby 1.9.2、rails 3.0.9、rspec 2.6

【问题讨论】:

标签: ruby ruby-on-rails-3 rspec tdd rake


【解决方案1】:

上述许多答案都对我运行单一规范有用。但是,在为单个 rake 任务运行多个规范时,我必须采取额外的步骤。

在每个规范之后,我必须运行Rake::Task.clear,因为(出于某种原因)如果任务被注册为already_invoked(即如果Rake::Task['my_task'].already_invoked 返回true,则该任务将不会再次运行。

我在我的 rake 任务规范中添加了以下行:

after { Rake::Task.clear }

当为同一个 rake 任务运行多个测试时,一切都按预期工作。

【讨论】:

    【解决方案2】:

    对我来说(rails-6)

    Rails.application.load_tasks
    Rake::Task['app:sync'].invoke
    

    => 在我的情况下不需要

    【讨论】:

      【解决方案3】:

      我们还需要这个任务

      require 'rake'
      Rake.application.rake_require 'tasks/new_adapter'
      

      在此之后,只需调用任务

      Rake::Task['new:adapter'].invoke
      

      【讨论】:

        【解决方案4】:

        如果我们需要使用多个 rake 任务,我们可以添加

        require "rake"
        Rails.application.load_tasks
        

        然后简单地调用任何任务。

        Rake::Task['sync:process_companies'].invoke
        

        虽然我无法确认它是否较慢,因为它会加载所有任务

        【讨论】:

        • 使用Rails.application.load_tasks 导致我测试污染问题,如果load_tasks 之前已经在同一个套件中调用过,我的rake 任务将被多次调用。使用上述解决方案可以避免此问题。
        【解决方案5】:

        当我需要执行自己的 rake 任务时,批准的答案对我不起作用

        这是我的解决方案

        放在spec文件的顶部

        require 'rake'
        

        将这些行放在您需要执行自定义 rake 任务的位置,例如rake update_data 从文件 example.rake

        load File.expand_path("../../../lib/tasks/example.rake", __FILE__)
        # make sure you set correct relative path 
        Rake::Task.define_task(:environment)
        Rake::Task["update_data"].invoke
        

        我的环境:

        rails (4.0.0)
        ruby (2.0.0p195)
        rspec-core (2.14.7) 
        rspec-expectations (2.14.3) 
        rspec-mocks (2.14.4) 
        rspec (2.14.1) 
        rspec-rails (2.14.0) 
        

        【讨论】:

        • 嗨,我使用的是 Rails.application.load_tasks,下面需要“rake”。这是一个好的解决方案吗?
        • Rake::Task.define_task(:environment) 避免RuntimeError: Don't know how to build task 'environment' (see --tasks)的胜利
        • 我正在使用:Rake.application.rake_require "tasks/task-name" 加载正在测试的特定任务,而不是使用 Rails.application. load_tasks 加载所有任务(Rails 5,Rspec 3.5)
        【解决方案6】:

        您可以按以下方式调用 Rake 任务:

        require 'rake'
        Rake::Task[name].invoke
        

        在这种情况下,这将导致以下代码:

        require 'rake'
        Rake::Task['db:test:purge'].invoke
        

        【讨论】:

        • 做到了。谢谢。我也把任务的名称弄错了,这让我一开始很失望。在 Rails 3 中,rake test:prepare 似乎可以解决问题
        • @jim 好点。您可以在这些情况下使用 Rake::Task[name].execute ,但您需要确保满足它的任何依赖项(例如:environment),因为它们不会在何时运行使用此方法调用任务。
        • 这很有帮助。上面的例子是如何将参数传递给任务的?
        • 我认为有时需要调用MyRailsApp::Application.load_tasks来加载任务
        • @egezer 使用MyRailsApp::Application.load_tasks 导致我测试污染问题,如果load_tasks 早先在测试套件中被调用,我的rake 任务将被多次调用。使用Rake.application.rake_requireRake::Task.define_task(:environment) 可以避免这个问题。
        猜你喜欢
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 2015-05-12
        • 2011-05-06
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        相关资源
        最近更新 更多