Настройка Factory Girl с помощью Test::Unit and Shoulda

Я пытаюсь настроить Factory Girl с помощью Test::Unit и Shoulda в Ruby on Rails. Я установил драгоценный камень, создал файл factory в каталоге test/factories и создал файл спецификации в каталоге test/models. Текущая ошибка, которую я получаю, это «ArgumentError: Нет такой фабрики: тест», что наводит меня на мысль, что файл test_factory.rb не загружается? Любая идея относительно того, что я должен изменить?

Вот мои файлы.

#test/factories/test_factory.rb
Factory.define :test do |t|  
  t.name 'test_spotlight'  
  t.label 'test spotlight label'  
end

и

#test/modes/test_spec.rb
require 'test_helper'
require 'factory_girl'
class TestTest < Test::Unit::TestCase
  def setup
    @test = Factory.build(:test)
  end

  context "A test" do
    should "save with the minimum requirements" do
      assert @test.save
    end
  end 
end 

person NolanDC    schedule 21.07.2009    source источник


Ответы (13)


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

require 'factory_girl'
Factory.find_definitions

Надеюсь это поможет.

person Kenny    schedule 31.08.2009
comment
Это сработало для меня, поместив его в мой файл test_helper.rb. Я столкнулся с этим при использовании factory_girl 1.3.3, rails 2.3.11, ruby ​​1.8.7 и bundler 1.0.10. - person Sukima; 09.03.2011
comment
У меня работали рельсы 3.0.9, пока я делал railstutorial. Помещен в мой файл user_helper. - person LondonGuy; 07.07.2011
comment
Для Rails 3.04, FactoryGirl 3.3.0 используйте: FactoryGirl.find_definitions вместо Factory.find_definitions - person dekeguard; 28.05.2012

Попробуйте поместить это в test_helper.rb:

require 'factory_girl'
Dir.glob(File.dirname(__FILE__) + "/factories/*").each do |factory|
  require factory
end
person dg.    schedule 23.11.2009

Только что обнаружил factory_girl_rails, где говорится, что автозагрузка - единственная дополнительная вещь, которую он имеет

person Ghoti    schedule 01.04.2011

У меня такая же проблема. В конце концов я справился, поместив все свои фабрики в «/test/factories.rb» и написав следующие строки в моем файле «/test/test_helper.rb»:

require 'factory_girl'
require File.dirname(__FILE__) + "/factories"

вы можете сделать то же самое для нескольких файлов, потребовав их в файле test_helper. Я еще не понял, почему автоматическое включение, упомянутое в ридми "factory_girl", не происходит.

person Ethan Vizitei    schedule 12.11.2009

Мне также удалось избавиться от этой проблемы, поместив эту строку в мой файл environment.rb:

config.gem "factory_girl", :source => "http://gemcutter.org"

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

Имя изменено с «threadbot-factory_girl» на «factory_girl», источник изменен с «http://gems.github.com" на "http://gemcutter.org".

person auralbee    schedule 18.12.2009

Если у вас возникла эта проблема с ruby ​​1.9.2, require ожидает расширенный путь.

File.expand_path("test/factories.rb")

Этот patch решил мою проблему. Я только что отправил запрос на вытягивание. После этого вы можете добавить это в свой test_helper.rb:

require 'factory_girl'
FactoryGirl.find_definitions
person riethmayer    schedule 24.07.2010

Если бы мне требовалось только «factory_girl» в test_helper.rb, я бы получил такое же поведение, как вы упомянули, но если бы мне это потребовалось в моем config/test/environment.rb (обратите внимание, я использую environmentalist), он правильно найдет определение Factory без каких-либо проблем.

Я попробовал это после прочтения rdoc factory girl, где говорится, что нужно поместить config.gem в вашу среду.

person Greg    schedule 22.11.2009

Я также столкнулся с проблемой - после обновления FactoryGirl до 1.3.2 - что фабрики из test/factory больше не загружались автоматически.

Я мог бы избавиться от проблемы, добавив код из dg в test_helper.rb:

Dir.glob(File.dirname(__FILE__) + "/factories/*.rb").each do |factory|
 require factory
end

При запуске одиночных тестов в Textmate все работало нормально, но запуск, например. все модульные тесты из командной строки с использованием rake test:units завершились с ошибкой DuplicateDefinitionError (я читал, что это, вероятно, как-то связано с ruby ​​1.8.x). Поэтому я немного изменил код:

if (!Factory.factories || Factory.factories.empty?)
  Dir.glob(File.dirname(__FILE__) + "/factories/*.rb").each do |factory|
    require factory
  end
end
person auralbee    schedule 19.10.2010
comment
У меня была точно такая же проблема. Спасибо! - person deb; 12.11.2010

Вы пробовали перемещать

require 'factory_girl'

в ваш test/test_helper.rb ?

Заводской механизм автозагрузки может зависеть от того, где вызывается требование. Это может быть попытка найти фабрики *test/models/factories/** вместо *test/factories/**

person Community    schedule 21.07.2009

Вместо того, чтобы называть ваш заводской файл test_factory.rb, попробуйте назвать его factory.rb

person Kevin Chan    schedule 22.07.2009
comment
документы говорят, что любой файл .rb в каталоге test/factories должен быть загружен - person brad; 10.12.2009

Интересный. У меня была аналогичная проблема, когда я пытался заставить огурец работать с factory_girl. Первоначально я настроил factory_girl для поиска ('config.gem'), но не загружал его в окружение огурца и полностью требовал в 'features/support/env.rb', так же, как огурец делает для webrat и т. д. Это только начало работать, когда я прямо сказал factory_girl найти его определения, как предложил Кенни выше.

Когда я удалил оператор require из env.rb и полностью потребовал factory_girl в среде с огурцом, эффект исчез, и factory_girl заработала из коробки.

Так что вопрос действительно в том, когда (или в каком контексте) будет загружаться factory_girl.

person Christian    schedule 09.03.2010

Поскольку разные люди используют разные версии Rails (наиболее распространенными сейчас являются 2.x и 3.x), важно включить другие соответствующие части вашей среды (наиболее важным является то, на какой версии Rails вы работаете). . С веб-страницы factory_girl, документация версии 1.3.0 (http://rubydoc.info/gems/factory_girl/1.3.0/frames):

Если вы хотите использовать factory_girl с Rails 3, используйте гем factory_girl_rails, а не этот.

Если вы хотите использовать factory_girl с версиями Rails до Rails 3, используйте версию 1.2.4.

Если у вас возникли проблемы с загрузкой, я бы посоветовал убедиться, что вы используете правильную версию. Я предполагаю, что версии factory_girl выше 1.2.4 вносятся в качестве зависимостей для драгоценного камня factory_girl_rails (Rails 3.0+).

person rholmes    schedule 24.08.2011

Я добавил require 'factory_girl' require File.dirname(FILE) + "/factories" в spec_helper.rb, что помогло, но потом я вспомнил, что иногда со Spork могут возникать проблемы, поэтому я перезапустил Spork без require, и тогда все заработало нормально.

person abegbg    schedule 19.09.2011