在我的Rails应用程序中,我试图为属于不同用户的设备保存MAC地址。每个MAC地址必须是唯一的,因此我包括了唯一性验证。
由于我尝试使用Rails控制台(ActiveRecord::RecordNotUnique
)时,重复记录被拒绝,因此验证本身似乎正在起作用。但是,我检查只能保存唯一记录的测试失败了。
所以我的问题是:
before_save
回调?这是我要进行测试的错误消息:
Expected #<MacAddress id: nil, user_id: nil, address: "MACADD123", created_at: nil, updated_at: nil> to be nil or false
在我的模型文件中设置:
# app/models/mac_address.rb
class MacAddress < ApplicationRecord
validates :address, uniqueness: true
belongs_to :user
end
# app/models/user.rb
class User < ApplicationRecord
has_many :mac_addresses, dependent: :destroy
end
测试以检查唯一性:
class MacAddressTest < ActiveSupport::TestCase
test 'mac address must be unique' do
new_mac = 'MACADD123'
assert MacAddress.create(user: User.first, address: new_mac)
assert MacAddress.all.pluck(:address).include?(new_mac)
# The 'assert_not' below is failing.
assert_not MacAddress.create(user: User.second, address: new_mac)
end
end
谢谢您的帮助。
答案 0 :(得分:2)
根据the documentation on create
:
请注意,该记录没有id
。它尚未持久。使用.errors.full_messages
检查错误,以查看唯一性验证失败。
无论对象是否成功保存到数据库中,都会返回结果对象。
您应该断言它已保存,例如:
mac_address = MacAddress.create(...)
assert !mac_address.new_record?
告诉您是否已保存它的位置。另外,您可以使用create!
,如果失败,它将引发ActiveRecord::RecordInvalid
。
答案 1 :(得分:1)
为以后参考和任何查看此问题的人-我用save
而不是create
重写了测试,如下所示:
test 'mac address must be unique' do
test_address = 'MACADD123'
original_mac = MacAddress.new(user: User.first, address: test_address)
duplicate_mac = MacAddress.new(user: User.second, address: test_address)
assert original_mac.save
assert MacAddress.pluck(:address).include?(test_address)
assert_not duplicate_mac.save
duplicate_mac.errors.messages[:address].include?('has already been taken')
end