我需要为相关模型编写测试。
规范/工厂/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 }
info Faker::Lorem.paragraph(7)
trait :user_status do
status_id 0
end
trait :manager_status do
status_id 1
end
trait :admin_status do
status_id 2
end
end
end
但文件 spec/factories/users.rb 是空的。
架构:
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
页面 index.html.erb 包含以下代码:
....
...
<div class="status"><%= user.status.title if user.status_id %></div>
....
..
当我运行测试时:
it 'check response status code for index page' do
visit users_path
expect(response).to be_success
end
控制台显示以下错误消息:
Failure/Error: visit users_path ActionView::Template::Error: undefined method `title' for nil:NilClass
如何为具有特征的“用户”和“状态”编写工厂?
最佳答案
eirikir 的解决方案非常接近,但 Status
仍然不会有标题。
尝试这个:
规范/工厂/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 }
info Faker::Lorem.paragraph(7)
trait :regular do
association :status, factory: :user_status
end
trait :manager do
association :status, factory: :manager_status
end
trait :admin do
association :status, factory: :admin_status
end
end
end
规范/工厂/状态.rb
FactoryGirl.define do
factory :user_status, class: Status do
title 'User'
end
factory :manager_status, class: Status do
title 'Manager'
end
factory :admin_status, class: Status do
title 'Admin'
end
end
在您的规范中,创建您的
User
:create(:user, :regular)
create(:user, :manager)
create(:user, :admin)
或者
build(:user, :regular)
build(:user, :manager)
build(:user, :admin)
等等..
希望有帮助!
关于ruby-on-rails - 如何为关联工厂使用特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32464600/