2009-07-21 6 views
16

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

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

#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 

ответ

40

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

require 'factory_girl' 
Factory.find_definitions 

Надеется, что это помогает.

+1

Это сработало для меня, поместив его в файл 'test_helper.rb'. Я столкнулся с этим при использовании factory_girl 1.3.3, rails 2.3.11, ruby ​​1.8.7 и bundler 1.0.10 – Sukima

+0

Это даже работает для Rails 3.0.5 и Ruby 1.9.2p180 – Nikhil

+0

Работала для меня рельсов 3.0.9 во время выполнения railstutorial. Размещено в файле user_helper. – LondonGuy

0

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

require 'factory_girl' 

к вашему тест/test_helper.rb?

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

0

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

+0

Документы говорят, что любой файл .rb под каталогом test/factories должен быть загружен – brad

2

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

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

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

1

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

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

3

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

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

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

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

Кроме того, убедитесь у вас есть последний драгоценный камень:

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

0

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

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

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

2

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

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

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

require 'factory_girl' 
FactoryGirl.find_definitions 
1

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

я мог избавиться от этой проблемы путем добавления кода с дг в test_helper.rb:

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

При выполнении одиночных испытаний в Textmate, все работало нормально, но работает, например, все модульные тесты из командной строки с использованием теста rake: сбой модулей с помощью 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 
+0

У меня была такая же проблема. Спасибо! – deb

0

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

If you want to use factory_girl with Rails 3, use the factory_girl_rails gem, not this one.

If you want to use factory_girl with Rails versions prior to Rails 3, use version 1.2.4.

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

0

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