6

当我在开发中启动我的 rails 控制台时,我看到 FactoryGirl 创建对象。显然我做错了,但是正确的方法是什么?这段代码使我的测试工作......

# tests/factories/board.rb
FactoryGirl.define do

    factory :word do
        sequence(:text) { |n| "FAKETEXT#{n}" }
    end

    factory :board do
        trait :has_words do
            words [
                FactoryGirl.create(:word, id: "514b81cae14cfa78f335e250"),
                FactoryGirl.create(:word, id: "514b81cae14cfa7917e443f0"),
                FactoryGirl.create(:word, id: "514b81cae14cfa79182407a2"),
                FactoryGirl.create(:word, id: "514b81cae14cfa78f581c534")
            ]
        end
    end

end

请注意,在我的目录中的任何文件中都没有提到工厂的任何内容config,因此 gem 会自动进行任何加载。我的相关部分Gemfile内容如下:

# Stuff not to use in production
group :development, :test do
    # Command-line debugger for development
    gem "debugger"

    # for unit testing - replace fixtures
    gem "factory_girl_rails"
end

所以我可以把工厂女孩带出开发环境。但我认为这些记录是在使用工厂之前创建的,这表明我写错了我的工厂。但如果你告诉我工厂写得对,我就照做。

4

4 回答 4

7

有同样的问题。有两种方法可以解决这个问题,

1. 使用 FactoryGirl 语法在 Factory 中引用 Factory。

替换FacotryGirl.create(:my_factory)factory: :my_factory

有关此的更多信息,https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations

2.factory_girl :require => false在 Gemfile

这会导致工厂在启动时生成对象,

group :development, :test do  
  gem 'factory_girl_rails'
end  

为什么?在 Rails 启动期间,Bundler 需要development组中的所有 gem,而 FactoryGirl 似乎需要所有它们的工厂文件。要求工厂评估 Ruby 代码,因此FactoryGirl.create(:my_factory)被调用。

这可以通过以下方式解决,

# Gemfile
group :development, :test do  
  gem 'factory_girl_rails', :require => false
end  

只需确保在您的测试环境中手动要求 factory_girl,例如

# spec_helper
require 'factory_girl'
于 2013-08-31T19:45:56.480 回答
1

您只需要将工厂女孩移出开发环境即可。

我有同样的问题,所以我只是做了

group :test do
  gem 'faker'
  gem 'factory_girl_rails'
end

并且像魅力一样工作。

我根本没有在开发中使用这些宝石,所以在测试中定义它们是正确的。

于 2016-07-26T00:23:12.350 回答
0

假设您希望在调用工厂时而不是在 Rails 启动时创建单词,那么您需要将单词数组放在一个块中,即:

trait :has_words do
        words do [
            FactoryGirl.create(:word, id: "514b81cae14cfa78f335e250"),
            FactoryGirl.create(:word, id: "514b81cae14cfa7917e443f0"),
            FactoryGirl.create(:word, id: "514b81cae14cfa79182407a2"),
            FactoryGirl.create(:word, id: "514b81cae14cfa78f581c534")
            ]
        end 
    end
于 2013-08-08T22:45:51.920 回答
0

对于每个工厂或模型,您必须放入不同的文件

spec/factories/word_factory.rb
spec/factories/board_factory.rb

所以每个工厂的内容,你可以做类似这样的事情:

FactoryGirl.define do
  factory :board do
    word
    special_id
  end
end

在您的测试文件夹中时,例如 models/board_spec.rb

你可以创建你的对象

let(:word) { FactoryGirl.create(:word)
let(:board) { FactoryGirl.create(:board, word: word) }

不确定这是你需要的,如果我错了,请纠正我

于 2013-04-21T01:32:38.913 回答