FactoryGirl在开发环境中创建对象

Leo*_*opd 6 ruby-on-rails mongoid factory-bot

当我在开发中启动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
Run Code Online (Sandbox Code Playgroud)

请注意,在我的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
Run Code Online (Sandbox Code Playgroud)

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

wes*_*ter 7

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

1.使用FactoryGirl语法引用工厂中的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中

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

group :development, :test do  
  gem 'factory_girl_rails'
end  
Run Code Online (Sandbox Code Playgroud)

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

这可以修复,

# Gemfile
group :development, :test do  
  gem 'factory_girl_rails', :require => false
end  
Run Code Online (Sandbox Code Playgroud)

只需确保在测试环境中手动要求factory_girl,EG

# spec_helper
require 'factory_girl'
Run Code Online (Sandbox Code Playgroud)


Nic*_*ich 0

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

spec/factories/word_factory.rb
spec/factories/board_factory.rb
Run Code Online (Sandbox Code Playgroud)

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

FactoryGirl.define do
  factory :board do
    word
    special_id
  end
end
Run Code Online (Sandbox Code Playgroud)

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

你可以创建你的对象

let(:word) { FactoryGirl.create(:word)
let(:board) { FactoryGirl.create(:board, word: word) }
Run Code Online (Sandbox Code Playgroud)

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