如何在 rspec 中创建具有关联的对象?
how make object with assotiation in rspec?
请帮忙解决问题。我需要通过 gem factory_girl.
创建对象 'user'
数据库模式:
create_table "statuses", force: :cascade do |t|
t.string "title"
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.integer "status_id", default: 0
t.string "name"
end
factories/users.rb:
FactoryGirl.define do
factory :user do
sequence(:name){ |i| "us#{i}" }
sequence(:email){ |i| "us#{i}@ad.ad" }
password 'qwerty'
password_confirmation{ |u| u.password }
status_id FactoryGirl.create(:status0)
end
end
factories/statuses.rb:
FactoryGirl.define do
factory :status0 do
id 0
title 'user'
end
factory :status1 do
id 1
title 'manager'
end
factory :status2 do
id 2
title 'admin'
end
end
spec/controllers/users_controller_spec.rb:
describe UsersController, type: :controller do
describe 'users:index action' do
it 'check response status code for index page' do
user = FactoryGirl.create(:user)
visit users_path
expect(response).to be_success
end
end
end
但在 运行 测试后控制台显示以下错误消息:
kalinin@kalinin ~/rails/phs $ rspec spec/controllers/users_controllers_spec.rb:104
/home/kalinin/.rvm/gems/ruby-2.0.0-p598/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:261:in `const_get': uninitialized constant Status0 (NameError)
from /home/kalinin/.rvm/gems/ruby-2.0.0-p598/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:261:in `block in constantize'
......
............
您可以使用 association
关键字来定义两个工厂之间的关联。
所以,你的工厂应该是这样的:
FactoryGirl.define do
factory :user do
sequence(:name){ |i| "us#{i}" }
sequence(:email){ |i| "us#{i}@ad.ad" }
password 'qwerty'
password_confirmation{ |u| u.password }
association :status
end
end
FactoryGirl.define do
factory :status do
sequence(:id){ |id| id }
title 'user'
end
end
association :status
将确保 user
和 status
工厂之间的关联。
您可以查看更多 factory_girl 关联示例 here。
请帮忙解决问题。我需要通过 gem factory_girl.
创建对象 'user'数据库模式:
create_table "statuses", force: :cascade do |t|
t.string "title"
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.integer "status_id", default: 0
t.string "name"
end
factories/users.rb:
FactoryGirl.define do
factory :user do
sequence(:name){ |i| "us#{i}" }
sequence(:email){ |i| "us#{i}@ad.ad" }
password 'qwerty'
password_confirmation{ |u| u.password }
status_id FactoryGirl.create(:status0)
end
end
factories/statuses.rb:
FactoryGirl.define do
factory :status0 do
id 0
title 'user'
end
factory :status1 do
id 1
title 'manager'
end
factory :status2 do
id 2
title 'admin'
end
end
spec/controllers/users_controller_spec.rb:
describe UsersController, type: :controller do
describe 'users:index action' do
it 'check response status code for index page' do
user = FactoryGirl.create(:user)
visit users_path
expect(response).to be_success
end
end
end
但在 运行 测试后控制台显示以下错误消息:
kalinin@kalinin ~/rails/phs $ rspec spec/controllers/users_controllers_spec.rb:104
/home/kalinin/.rvm/gems/ruby-2.0.0-p598/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:261:in `const_get': uninitialized constant Status0 (NameError)
from /home/kalinin/.rvm/gems/ruby-2.0.0-p598/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:261:in `block in constantize'
......
............
您可以使用 association
关键字来定义两个工厂之间的关联。
所以,你的工厂应该是这样的:
FactoryGirl.define do
factory :user do
sequence(:name){ |i| "us#{i}" }
sequence(:email){ |i| "us#{i}@ad.ad" }
password 'qwerty'
password_confirmation{ |u| u.password }
association :status
end
end
FactoryGirl.define do
factory :status do
sequence(:id){ |id| id }
title 'user'
end
end
association :status
将确保 user
和 status
工厂之间的关联。
您可以查看更多 factory_girl 关联示例 here。