私は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フォルダー内のファイルは自動的に読み込まれることになっています。
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
これは Factory Botの問題 のようです。 (問題レポートに従って)FactoryBot.find_definitions
で修正しました:
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
config.before do
FactoryBot.find_definitions
end
end
これは必ずしも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を使用している場合に発生します。