Не знаю, как создать task — Cucumber

#ruby-on-rails #tdd #cucumber #rake

#ruby-on-rails #tdd #огурец #грабли

Вопрос:

В cucumber мои исходные данные загружаются с помощью нескольких задач rake. Ни один из которых не работает:

 Spree::Core::Engine.load_seed if defined?(Spree::Core)
Spree::Auth::Engine.load_seed if defined?(Spree::Auth)
Rake::Task['alchemy:db:seed'].invoke
 

Когда я запускаю одну из задач spree, я получаю:

 Don't know how to build task 'db:load_dir' (RuntimeError)
 

Когда я запускаю одну из задач alchemy rake, я получаю:

 Don't know how to build task 'alchemy:db:seed' (RuntimeError)
 

Тестовая база данных существует. Я запустил rake db:test:prepare , и, похоже, он настроен на основе моих проверок. Давайте перейдем к крючкам:

 # features/support/hooks.rb
Before do
  load File.join(Rails.root, 'db', 'seeds.rb')
end
 

Это переходит к корню и дает мне исходные данные. Я решил попробовать это:

 # features/support/hooks.rb
before do
  # load File.join(Rails.root, 'db', 'seeds.rb')
  Rake::Task['alchemy:db:seed'].invoke
end
 

Ошибка была:

 Don't know how to build task 'alchemy:db:seed' (RuntimeError)
 

Я не могу понять, почему задачи rake не работают в cucumber.

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

 source 'https://rubygems.org'
ruby '2.1.2'

gem 'rails', '4.0.6'

gem 'pg'
gem 'redis-rails'
gem 'redis-rack-cache'

gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'

gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'

gem 'thin'
gem 'durable_decorator_rails', github: 'jumph4x/durable_decorator_rails'
gem 'newrelic_rpm'
gem 'rake'

gem 'spree', '2.2.2'
gem 'spree_gateway', github: 'spree/spree_gateway', branch: '2-2-stable'
gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: '2-2-stable'
gem 'spree_bootstrap_frontend', github: '200Creative/spree_bootstrap_frontend', branch: '2-2-stable'

gem 'alchemy_cms', github: 'magiclabs/alchemy_cms'
gem 'spree_alchemy', github: 'tesserakt/spree_alchemy'

group :doc do
  gem 'sdoc', '~> 0.4.0'
end

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'meta_request'
end

group :test do
  gem 'simplecov', require: false
  gem 'cucumber-rails', require: false
  gem "cucumber-websteps"
  gem 'database_cleaner'
  gem "selenium-webdriver"
  gem "capybara-webkit"
end

group :development, :test do
  gem "factory_girl_rails", "~> 4.0"
  gem "rspec-rails"
  gem 'rspec-its'
  gem 'shoulda-matchers', require: false
end
 

И это мой файл поддержки env:

 # features/support/env.rb
require 'cucumber/rails'

ActionController::Base.allow_rescue = false

begin
  DatabaseCleaner.strategy = :transaction
rescue NameError
  raise 'You need to add database_cleaner to your' 
   'Gemfile (in the :test group) if you wish to use it.'
end

Cucumber::Rails::Database.javascript_strategy = :truncation

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome)
end

Capybara.javascript_driver = :chrome
 

Комментарии:

1. какую версию Rails вы используете? Откуда берется задача rake db:test:prepare ? Это не стандартная задача Rails. Поэтому я бы дважды проверил, действительно ли существует тестовая база данных. Вы могли бы попробовать RAILS_ENV=test rake db:setup и посмотреть, каков результат.

2. Rails 4.0.6 и я пробовал RAILS_ENV=test . Пробую ваши рекомендации.

3. @awenkh ваше редактирование вызвало undefined method 'before' for main:Object . Будет переключать его обратно.

4. @awenkhh если бы вы могли записать, что RAILS_ENV=test rake db:setup это решение, я передам вам очки 😉

5. о, круто — я создал ответ :). Что касается моего редактирования — я действительно не уверен, почему исправленное написание нарушает тесты. В любом случае извините за это…

Ответ №1:

Rake не загружает задачи по умолчанию, вы можете проверить сами:

 irb(main):002:0> require 'rake'
=> true
irb(main):003:0> Rake::Task.tasks
=> []
 

Таким образом, он не «знает», как выполнить вашу задачу. Вам нужно указать Rails для их загрузки:

 Rails.application.load_tasks

Spree::Core::Engine.load_seed if defined?(Spree::Core)
Spree::Auth::Engine.load_seed if defined?(Spree::Auth)
 

Ответ №2:

Кажется, что тестовая база данных отсутствует. Итак, как уже было написано в комментарии выше, решение состоит в том, чтобы создать базу данных и запустить миграции с

 RAILS_ENV=test rake db:setup
 

Рад помочь 🙂