我有一个模型,我在其中实现了一个验证,以防止在设置初始值后(在对象创建期间)进行更改。
它的工作原理如下:
模型/ deal.rb
validate :quantity_not_changeable, on: :update
def quantity_not_changeable
if quantity_changed?
errors.add(:quantity,
"Change of the initially defined qty is not possible")
end
end
这适用于我的应用:我创建了一个新的交易,它的工作原理。我尝试通过更改数量'来编辑它。字段,它失败了。我尝试编辑另一个字段(除了'数量'),它有效。 一切正常。
但我的Rspec测试测试失败。
实际上我知道它不起作用,因为on :: validate上存在问题。
确实没有' on :: validate',测试通过,但我当然不能删除' on :: update',因为我只想要用户在最初创建交易后无法对其进行编辑。
describe Deal do
let(:admin_user) { FactoryGirl.create(:admin_user) }
before(:each) do
@attr = {
title: "Neque porro quisquam est qui dolorem",
description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum",
quantity: 10
}
end
describe "my test" do
describe "test that nb of quantity can't be changed after initial creation" do
it "fails if initial quantity is changed" do
deal = Deal.create(@attr)
deal.update(quantity: 15)
expect(deal).to have(1).errors_on(:quantity)
end
end
但是我得到了这个rspec错误:
Failure/Error: expect(deal).to have(1).errors_on(:quantity)
expected 1 errors on :quantity, got 0
我将使用下面的"打印变量":p交易显示为什么我确定它是由于:::更新在测试中无效。
第一:如果我放置' p deal'在更新它之前,让我们看看交易对象的价值:
describe "my test" do
describe "test that nb of quantity can't be changed after initial creation" do
it "fails if initial quantity is changed" do
deal = Deal.create(@attr)
p deal
deal.update(quantity: 15)
expect(deal).to have(1).errors_on(:quantity)
end
end
我得到以下输出(我们看到一切正常:数量确实是10)
#<title: "Neque porro quisquam est qui dolorem", description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lo...", quantity: 10>
第二:现在让我们推动这笔交易&#39;在我尝试测试以更新数量&#39;
的值之后describe "my test" do
describe "test that nb of quantity can't be changed after initial creation" do
it "fails if initial quantity is changed" do
deal = Deal.create(@attr)
deal.update(quantity: 15)
p deal
expect(deal).to have(1).errors_on(:quantity)
end
end
现在的输出是:( 我们看到对于我们可以预期的因为验证:::代码中的更新,Rspec测试管理不幸更新数量值) :
#<title: "Neque porro quisquam est qui dolorem", description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lo...", quantity: 15>
所以我不明白为什么实际上我手动测试并且无法更新,但是在我的rspec测试套件中它会更新!!!
数小时了解它但没有成功......我试图找到一些在线资源,有些人说on: :update is a weak way to do things。我真的不知道如何处理这个奇怪的错误。
请帮忙。
答案 0 :(得分:4)
由于其他验证,我认为在调用create
方法时不会保存条目。您可以尝试使用rails c
打开控制台并评估以下内容:
deal = Deal.create(title: 'mytitle', description: 'mydescription', quantity: 10)
deal.persisted?
然后如果你弄错了,以便找出创建时出现的错误:
deal.errors.messages
修改强>
此测试应通过:
it "fails if initial quantity is changed" do
deal = Deal.create(@attr)
deal.update(quantity: 26)
expect(deal.errors.messages).to eq({quantity: ["Change of the initially defined qty is not possible"]})
end
但这些不应该:
it "exploited test that should not pass because messages hash should not be empty" do
deal = Deal.create(@attr)
deal.update(quantity: 26)
expect(deal.errors.messages.empty?).to eq(true)
end
it "exploited test in other variation" do
deal = Deal.create(@attr)
deal.update(quantity: 26)
expect(deal.errors.messages).to eq({})
end