web-dev-qa-db-ja.com

ArgumentError:ファクトリが登録されていません

私はRails 4.1.1アプリでrspecを使用して工場の女の子を実行するようにしています。

問題は、コマンドラインでrspecを実行すると、Failure/Error: verse = build(:verse) ArgumentError: Factory not registered: verseが表示されることです。

SO=でファクトリーガールの開始ページと多くの回答を確認しましたが、まだこの問題を解決できません。

私のGemfileで:

gem 'Rails', '4.1.1'
group :development, :test do
  gem 'rspec-Rails'
  gem "factory_girl_Rails"
end

私のspec_helper.rbファイル:

require 'factory_girl_Rails'
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end

spec/controllers/api/verses_controller_spec.rb

describe "API Controller" do
  describe "show a verse" do
    it "should return status 200" do
      verse = build(:verse)
      get :show, id: verse.id
      expect(response).to have_http_status(200)
    end
    it "should return json object" do
      verse = build(:verse)
      get :show, id: verse.id
      JSON.parse(response.body).should == {'id' => verse.id}
    end
  end
end

spec/factories/verses.rb

FactoryGirl.define do
  factory :verse do
    line1 "A beautiful verse I stand"
  end
end

工場が適切にロードされないのはなぜですか? spec/factoriesフォルダー内のファイルは自動的に読み込まれることになっています。

26
fkoessler

Springでrspec/factory girlを使用すると問題が発生するようです。

追加:

config.before(:all) do
  FactoryGirl.reload
end

私のspec_helper.rbで問題を解決しました。

クレジット: https://github.com/Rails/spring/issues/88

編集:

この問題を修正するもう1つの方法は、Factory Girlにファクトリをロードする場所を手動で指示することです。これをspec_helperに追加します:

FactoryGirl.definition_file_paths = [File.expand_path('../factories', __FILE__)]
FactoryGirl.find_definitions
49
fkoessler

これは Factory Botの問題 のようです。 (問題レポートに従って)FactoryBot.find_definitionsで修正しました:

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods

  config.before do
    FactoryBot.find_definitions
  end
end
12
David Moles

これは必ずしもSpringが原因ではありません。 issue があります。つまり、factory_girlはrspecとは少し異なるパスをロードします。解決策は、Rails_helperに以下を追加することです

FactoryGirl.definition_file_paths << File.join(File.dirname(__FILE__), 'factories')
FactoryGirl.find_definitions

ヘルパーがengine_root/specにあると仮定します。

これは、Railsエンジンでrspecを使用している場合に発生します。

5
Obromios