rspec stub out errors.add

时间:2012-03-14 22:23:08

标签: ruby-on-rails validation rspec

我有一个名为'transaction'的模型的日期属性,当我保存它时我想检查它是否在一个范围内,如果没有则将日期设置为上一个事务。

它正在工作,但我似乎无法让我的测试工作,它在添加错误时不断轰炸。有没有办法将'errors.add'行存根,以便我可以隔离我的测试以检查tran_date值是否已正确更改?

  def tran_date_within_financial_year
    range = ledger.fin_start..ledger.fin_end
    unless range === tran_date
      tran = Transaction.all.order("created_at").last
      self.tran_date = tran.tran_date
      errors.add(:tran_date, "is outside financial year")
    end
  end

这是我的测试

context "date is empty" do
  it "should set date to previous transaction" do
    @prev_tran = Transaction.make!(:tran_date => Date.new(2012,02,03))
    @tran = Transaction.make!(:tran_date => "")
    @tran.save
    @tran.reload.tran_date.should eq(@prev_tran.tran_date)
  end
end

运行rspec时的结果是:

  1) Transaction Saving a transaction date is empty should set date to previous transaction
     Failure/Error: @tran = Transaction.make!(:ledger => ledger, :tran_date => "")
     ActiveRecord::RecordInvalid:
       Validation failed: Tran date is outside financial year

但是,如果我注释掉error.add函数,那么我的测试通过了。因此,它正确地将值设置为上一个交易日期。问题是errors.add一起停止测试。

1 个答案:

答案 0 :(得分:0)

嗯,规范只是强调你无法保存无效的对象。

该对象无效,因为您向其添加了错误。

这些规格应该通过:

context "date is empty" do
  it "should set date to previous transaction" do
    @prev_tran = Transaction.make!(:tran_date => Date.new(2012,02,03))
    @tran = Transaction.make(:tran_date => "")
    @tran.should_not be_valid
    @tran.errors.should have_key :tran_date
    @tran.tran_date.should eq(@prev_tran.tran_date)
  end
end