2012-03-10 51 views
0

給定一個模型的方法self.fetch_payment_method成株:找到一個模型類

def self.fetch_payment_method 
    name = "Omnikassa" 
    pm = Spree::PaymentMethod.find(:first, :conditions => [ "lower(name) = ?", name.downcase ]) || raise(ActiveRecord::RecordNotFound) 
end 

而且一個RSpec測試,測試這一點:

it 'should find a payment_method' do 
    Spree::PaymentMethod.new(:name => "Omnikassa").save 
    @omnikassa.class.fetch_payment_method.should be_a_kind_of(Spree::PaymentMethod) 
end 

我想改善這一點,所以它不測試整個堆棧和數據庫。爲此,我只想在類Spree::PaymentMethod上調用「:find」。但是:

it 'should find a payment_method' do 
    Spree::PaymentMethod.any_instance.stub(:find).and_return(Spree::PaymentMethod.new) 
    @omnikassa.class.fetch_payment_method.should be_a_kind_of(Spree::PaymentMethod) 
end 

不起作用。我對整個BDD/TDD事物都比較陌生,對我來說,殘留和嘲弄對我來說仍然是不可思議的。所以我很可能誤解了樁和返回正在做什麼。

我應該如何爲SomeActiveRecordModel.find存根?

回答

4

你做正確的一切,除了存根方法應該呼籲Spree::PaymentMethod類本身,而不是它的實例

而且它是常見的做法與此存根返回一個特定的情況下,不只是一個新問題:

it 'should find a payment_method' do 
    payment_meth = mock_model(Spree::PaymentMethod) 
    Spree::PaymentMethod.stub!(:find).and_return(payment_meth) 

    @omnikassa.class.fetch_payment_method.should be_equal(payment_meth) 
end 

而且,順便說一下,您初始化@omnikassa對象的位置在哪裏?