2012-03-14 54 views
0

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

它的工作,但我似乎无法让我的测试工作,它添加错误时不断爆炸。有没有一种方法可以将'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功能,那么我的测试通过。所以它正确地设置了前一个交易日期的值。问题在于错误.add一起停止测试。

回答

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 
+0

通知你应该使用'make',不'make'已知无效的对象 – apneadiving 2012-03-14 22:35:00

+0

好像我忘了一些''上上面... :) – apneadiving 2012-03-14 23:11:52

+0

-1是!更好地解释 – apneadiving 2014-11-18 14:55:30