【问题标题】:FactoryGirl creating objects in development environmentFactoryGirl 在开发环境中创建对象
【发布时间】:2013-04-18 20:52:44
【问题描述】:

当我在开发中启动 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

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

【问题讨论】:

  • 这个代码在规范/工厂中吗?
  • 该代码在工厂文件中。添加了位置的评论。
  • factory_girl 如何在您的 gem 文件中列出?
  • 更新了 Gemfile 的相关部分。
  • 看起来不是工厂不正确。看起来一定有什么东西在你的测试之外调用它。不如对您的应用程序进行全局文本搜索以查找 FactoryGirl 并查看它是否在任何地方被调用?

标签: ruby-on-rails mongoid factory-bot


【解决方案1】:

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

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,EG

# spec_helper
require 'factory_girl'

【讨论】:

    【解决方案2】:

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

    我遇到了同样的问题,所以我就这样做了

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

    而且效果很好。

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

    【讨论】:

      【解决方案3】:

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

      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) }
      

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

      【讨论】:

      • 将工厂定义移动到它们自己的文件中并没有改变任何东西。而且我使用的是 test_unit 而不是 rspec,所以我不确定您的其他建议该怎么做。
      【解决方案4】:

      假设您希望在调用工厂时而不是在 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 2011-07-26
        • 1970-01-01
        • 2011-02-27
        • 2022-09-25
        • 1970-01-01
        • 2019-05-03
        相关资源
        最近更新 更多