【问题标题】:Object id not generated while running feature tests in Rails with FactoryGirl使用 FactoryGirl 在 Rails 中运行功能测试时未生成对象 ID
【发布时间】:2014-05-11 16:50:08
【问题描述】:

无法弄清楚为什么工厂女孩没有为我生成我的问题 ID。

工厂:

用户:

require 'faker'

FactoryGirl.define do
  factory :user do
    email {Faker::Internet.email}
    name {Faker::Name.name}
    password '12345678'
    password_confirmation '12345678'
  end
end

问题:

require 'faker'

FactoryGirl.define do
  factory :question do
    association :user
    title "Random question about Ruby on Rails"
    body { Faker::Lorem.paragraph(2) }
  end
end

功能测试

require 'spec_helper'

feature "Show questions" do

  given(:user) { FactoryGirl.create(:user) }    
  given(:question) { FactoryGirl.build(:question, user_id: user.id) }

  scenario 'guest user cannot visit edit question path' do
    visit edit_question_path(question)
    expect(current_url).to eq root_url
  end

...

end

终端失败:

ActionController::UrlGenerationError:
No route matches {:action=>"edit", :controller=>"questions", :format=>nil, 
:id=>#<Question id: nil, title: "Random question about Ruby on Rails", 
body: "Dolor in doloribus labore. Totam debitis eveniet v...", created_at: nil, updated_at: nil, user_id: 6309>} missing required keys: [:id]

我知道解决方案就在那里,但我无法理解问题所在。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec factory-bot


    【解决方案1】:

    使用build 创建一个还没有数据库ID 的内存对象

    FactoryGirl.build(:question, user_id: user.id)
    

    使用create将在数据库中创建带有id的记录

    FactoryGirl.create(:question, user_id: user.id)
    

    您当前的代码正在尝试转到从未保存过的Question 的编辑页面

    【讨论】:

    • 而 create 在功能规范中可能更合适,它旨在锻炼整个应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多