ruby-on-rails - 如何为关联工厂使用特征?

标签 ruby-on-rails rspec factory-bot

我需要为相关模型编写测试。

规范/工厂/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/

相关文章:

ruby-on-rails - 在 Rails 5 的自定义测试文件夹中运行测试

selenium - Docker + Rspec + Capybara - 参数 [0] 未定义

ruby - 错误 : null value in column "id" violates not-null constraint

ruby-on-rails - 更新 FactoryBot 特征中的关联对象

ruby-on-rails - 使用 FactoryGirl 在 Rails 中运行功能测试时未生成对象 ID

ruby-on-rails - ruby on rails 命名作用域实现

ruby-on-rails - 如何添加存储为字符串的小时和分钟

ruby-on-rails - 如何包含 rspec 的支持文件

ruby-on-rails - 测试 Nokogiri XML 的属性

ruby-on-rails - 使用 rspec 测试 aasm 状态转换