Rspec测试验证' on :: update'不工作(Rails4 / Rspec 3)

时间:2015-09-21 06:26:28

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

我有一个模型,我在其中实现了一个验证,以防止在设置初始值后(在对象创建期间)进行更改。

它的工作原理如下:

模型/ 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。我真的不知道如何处理这个奇怪的错误。

请帮忙。

1 个答案:

答案 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