2015-07-25 3 views
3

У меня есть тест на рейк, который я настраиваю после единственных примеров, которые я могу найти в Интернете.Почему моя задача рейка выполняется дважды в моем тесте?

Это выглядит следующим образом:

require 'test_helper' 
require 'minitest/mock' 
require 'rake' 

class TestScrapeWelcome < ActiveSupport::TestCase 
    def setup 
    Rake.application.init 
    Rake.application.load_rakefile 

    @task = Rake::Task['scrape:scrape'] 
    @task.reenable 
    end 

    def teardown 
    Rake::Task.clear 
    end 

    test "scraping text and sending to elasticsearch" do 
    mocked_client = Minitest::Mock.new 
    get_fixtures.each_with_index do |arg,i| 
     mocked_client.expect :index, :return_value, [index: "test", type: 'welcome', id: i, body: arg] 
    end 
    Elasticsearch::Model.stub :client, mocked_client do 
     @task.invoke 
    end 
    assert mocked_client.verify 
    end 

    private 

    def get_fixtures 
    (0..11).map { |i| 
     File.read("test/fixtures/scrape/index_#{i}.json") 
    } 
    end 

end 

Но после того, как задача выполняется, как только он начинает работать снова без меня делать что-либо (puts печатает до и после @task.invoke показать, что задача только запустить один раз).

ответ

8

Оказывается, что рейк уже требуется и инициализируется при выполнении теста, поэтому все следующие строки необходимо удалить или задание будет определено дважды и будет выполняться дважды, даже если вы его только вызываете.

require 'minitest/mock' 
require 'rake' 
... 
Rake.application.init 
Rake.application.load_rakefile 
2

Обновленный ответ на рельсах 5.1 (с использованием MiniTest):

я обнаружил, что необходимо следующее загрузить задачи один раз и только один раз:

MyAppName::Application.load_tasks if Rake::Task.tasks.empty? 

В качестве альтернативы добавить MyAppName::Application.load_tasks к вашему test_helper, если вы не возражаете, чтобы загружаемые задачи выполнялись даже при выполнении отдельных тестов, которые им не нужны.

(Заменить MyAppName с именем приложения)

0

решением, которое работает для тестирования задач драгоценного камня, который было сделано Railtie поэтому он может добавить задачи в приложении Rails:

Не определите Railtie в тестовом режиме, когда вы также определяете класс Rails::Application в spec_helper.rb (который позволяет вашим тестам звонить Rails.application.load_tasks). В противном случае файл Rake будет загружен один раз как Railtie и один раз как двигатель:

class Railtie < Rails::Railtie 
    rake_tasks do 
    load 'tasks/mygem.rake' 
    end 
end unless Rails.env.test? # Without this condition tasks under test are run twice 

Другим решением было бы поставить условие в файле Рек пропустить определение задач, если уже был загружен файл.

Смежные вопросы