gpt4 book ai didi

ruby-on-rails - Rspec:如何创建模拟关联

转载 作者:行者123 更新时间:2023-12-04 05:30:51 27 4
gpt4 key购买 nike

我有以下类(class):

class Company < ActiveRecord::Base

validates :name, :presence => true

has_many :employees, :dependent => :destroy

end


class Employee < ActiveRecord::Base

validates :first_name, :presence => true
validates :last_name, :presence => true
validates :company, :presence => true

belongs_to :company

end

我正在为 Employee 写测试类,所以我正在尝试创建 doubleCompany将由 Employee 使用.

下面是我的 Rspec 的片段
let(:company) { double(Company) }
let(:employee) { Employee.new(:first_name => 'Tom', :last_name => 'Smith', :company => company) }

context 'valid Employee' do

it 'will pass validation' do
expect(employee).to be_valid
end

it 'will have no error message' do
expect(employee.errors.count).to eq(0)
end

it 'will save employee to database' do
expect{employee.save}.to change{Employee.count}.from(0).to(1)
end

end

我的所有 3 个测试都收到以下错误消息
ActiveRecord::AssociationTypeMismatch:
Company(#70364315335080) expected, got RSpec::Mocks::Double(#70364252187580)

我想我试图创造的方式 double是错的。你能指导我如何创建一个 double of Company可以由 Employee 使用作为他们的协会。

我没有使用 FactoryGirl .

非常感谢。

最佳答案

没有什么好的方法可以做到这一点,而且我不确定您是否需要这样做。

您的前两个测试本质上是在测试相同的东西(因为如果 employee 有效,则 employee.errors.count 将为 0,反之亦然),而您的第三个测试正在测试框架/ActiveRecord,而不是您的任何代码。

正如其他答案所提到的,Rails 在以这种方式验证时需要相同的类,所以在某些时候你必须坚持 company .但是,您可以在一次测试中做到这一点,并在所有其他测试中获得您想要的速度。像这样的东西:

let(:company) { Company.new }
let(:employee) { Employee.new(:first_name => 'Tom', :last_name => 'Smith', :company => company) }

context 'valid Employee' do
it 'has valid first name' do
employee.valid?
expect(employee.errors.keys).not_to include :first_name
end

it 'has valid last name' do
employee.valid?
expect(employee.errors.keys).not_to include :last_name
end

it 'has valid company' do
company.save!
employee.valid?
expect(employee.errors.keys).not_to include :company
end
end

如果你真的想保留你的第三个测试,你可以包括 company.save!在您的 it阻止或禁用验证(尽管如此,您当时甚至在测试什么?):
it 'will save employee to database' do
expect{employee.save!(validate: false)}.to change{Employee.count}.from(0).to(1)
end

关于ruby-on-rails - Rspec:如何创建模拟关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34369275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com