Попытка загрузить мои начальные данные перед тестами на огурцы в Rails3 / Capybara с factory_girl - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть некоторые начальные данные (для ценовых диапазонов), которые одинаковы для prod, dev, test и не меняются. Мне нужны эти данные в моей тестовой базе данных для запуска моих тестов cuke.

Я загружаю свои начальные данные в тестовую БД до загрузки сценария, но это не удается.

У меня есть следующее в файле features / support / env.rb

# from http://www.andhapp.com/blog/2009/11/07/using-factory_girl-with-cucumber/
Before do
    require 'factory_girl_rails'
    # Dir.glob(File.join(File.dirname(__FILE__), '../../spec/factories/*.rb')).each {|f| require f }
    Dir.glob(File.join(File.dirname(__FILE__), '../../db/seeds.rb')).each {|f| require f }
end

Который загружает следующий файл:

# wipe out all previous data
Price.delete_all #is there a factory way of doing this?
# set defaults
Factory.define :price do |price|
  price.id                  1
  price.price_range         "$100"
end

# insert seed data
@price = Factory(:price, :id => 1, :price_range => "$100 - $500")
@price = Factory(:price, :id => 2, :price_range => "$500 - $1,000")
@price = Factory(:price, :id => 3, :price_range => "$1,000 - $1,000")
@price = Factory(:price, :id => 4, :price_range => "$10,000 - $100,000")

Я получаю следующее сообщение об ошибке:

Factory already defined: price (Factory::DuplicateDefinitionError)
 /Library/Ruby/Gems/1.8/gems/factory_girl-1.3.3/lib/factory_girl/factory.rb:61:in `define'
 /Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/../../db/seeds.rb:16
 /Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
 /Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
 /Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:227:in `load_dependency'
 /Library/Ruby/Gems/1.8/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:239:in `require'
 /Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/env.rb:92
 /Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/env.rb:92:in `each'
 /Applications/MAMP/htdocs/rails_testing/feedbackd/features/support/env.rb:92:in `Before'

Есть мысли?

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Вы можете позвонить Factory.define :price только один раз, и я бы, вероятно, не поместил его в тот файл, в котором он находится сейчас. У вас есть папка фабрики? Обычно он живет на спец / фабриках. Там я бы создал файл price.rb и однажды определил вашу фабрику. factory_girl должен автоматически загрузить все эти определения для вас один раз.

Если вы используете Rails3 и у вас есть factory_girl_rails в вашем Gemfile, то вам даже не нужно это require 'factory_girl_rails', оно делает это за вас.

Также, если у вас новая версия огурца, программа установки должна автоматически добавить этот раздел в env.rb:

if defined?(ActiveRecord::Base)
  begin
    require 'database_cleaner'
    DatabaseCleaner.strategy = :truncation
  rescue LoadError => ignore_if_database_cleaner_not_present
  end
end

DatabaseCleaner - это хороший способ усечения вместо использования вашего Price.delete_all

Последнее, что нужно - seed.rb - это хорошая концепция, которая очень похожа на то, что мы делаем в одном из наших приложений на работе.

Но имейте в виду, что все в каталоге features/support автоматически запрашивается огурцом, поэтому вам не нужно иметь эту глупость Dir.glob.

С factory_girl мы не используем файл с семенами rails по умолчанию, потому что он не очень применим (по нашему мнению).

Я бы просто добавил файл с именем что-нибудь (наше имя db_setup.rb), которое выглядит примерно так:

Before do
  # Truncates the DB before each Scenario,
  # make sure you've added database_cleaner to your Gemfile.
  DatabaseCleaner.clean

  Factory(:price, :attr1 => 'blah'...)
  # More factories here etc
end
0 голосов
/ 04 февраля 2011

Взгляните на крючки:

https://github.com/aslakhellesoy/cucumber/wiki/Hooks

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

Вы также можете использовать способ с тяжелыми руками и делать рейк db: test: clone.

...