【问题标题】:Factory_girl create gives validation errorFactory_girl create 给出验证错误
【发布时间】:2014-09-12 12:35:05
【问题描述】:

我正在尝试在我的 rails 应用程序中测试销毁操作。我使用 Factory_girl 创建对象。 创建公司对象时,必须添加用户关系。但这就是我尝试使用 Factory_girl 创建公司时失败的地方。

user_spec.rb

describe User do

  before(:each) { @user = User.new(email: 'user@example.com') }

  subject { @user }

  it { should respond_to(:email) }
  it { should respond_to(:companies) }

  it "#email returns a string" do
    expect(@user.email).to match 'user@example.com'
  end

  describe "company associations" do 
    let!(:a_company) do
      FactoryGirl.create(:company, user: @user)
    end

   it {should have_many :companies, :dependent => :destroy}
  end

end

工厂.rb

FactoryGirl.define do
  factory :user do
    confirmed_at Time.now
    name "Test User"
    email "test@example.com"
    password "please123"

    trait :admin do
      role 'admin'
    end
  end   
  factory :company do
    name "Total Inc."
    user :user 
  end
end

模型/用户.rb

class User < ActiveRecord::Base
  has_many :companies, dependent: :destroy
  enum role: [:user, :vip, :admin]
  after_initialize :set_default_role, :if => :new_record?

  def set_default_role
    self.role ||= :user
  end

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :invitable, :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable
end

模型/公司.rb

class Company < ActiveRecord::Base
    belongs_to :user
    validates :user_id, presence: true
end

我得到的错误:

失败:

  1) User company associations
     Failure/Error: FactoryGirl.create(:company, user: @user)
     ActiveRecord::RecordInvalid:
       Validation failed: User can't be blank

编辑

我遵循了下面的建议,现在我可以创建但出现以下错误:

Failure/Error: it {should have_many :companies, :dependent => :destroy} expected #<User:0x007fc7b7ce08c0> to respond to has_many?

【问题讨论】:

  • @user 总是nil 你应该在before(:each) 块中使用create 而不是new。公司从不创造,因为@user 总是nil
  • 尝试使用let 而不是let!
  • 在你公司的工厂里应该只是user而不是user :user
  • @BroiSatse 这也可能有问题,但 User.new.id == nil 和公司未创建,验证 :user_id 存在失败。
  • @gtheys 应该是 it { should have_many(:companies).dependent(:destroy) } look carefully doc

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


【解决方案1】:

第一个错误Validation failed: User can't be blank 是由于没有保存@user 对象造成的。您可以通过在调用 create 之前保存对象来修复错误:

let!(:a_company) do
  @user.save
  FactoryGirl.create(:company, user: @user)
end

第二个错误,Failure/Error: it {should have_many :companies, :dependent =&gt; :destroy} expected #&lt;User:0x007fc7b7ce08c0&gt; to respond to has_many? 是一个测试错误 - 生产代码工作正常。要修复您的测试,请尝试以下选项之一:

使用Shoulda

it {should have_many(:companies).dependent(:destroy)}

使用 FactoryGirl

it 'Expects user to have many companies' do
  expect{@user.companies}.to_not raise_error
end

【讨论】:

  • 使用 create 而不是 new 已经解决了Validation failed: User can't be blank。为了测试 shoulda 选项给出了undefined method 'dependent' for #&lt;RSpec::Matchers::BuiltIn::Has:0x007fc7381583b0&gt;,使用带有期望的工厂女孩​​ :) 现在我只想知道为什么 shoulda 给出了未定义的方法错误?
  • 您是否已将gem 'shoulda' 添加到您的Gemfile 并捆绑?错误消息暗示你没有安装应该
  • 确实忘记安装了:D
猜你喜欢
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 2011-07-24
相关资源
最近更新 更多