2012-10-03 49 views
0

我在User.rb模型:測試控制器 - 無需存根before_save

before_save { self.email.downcase! } 

,我需要在users_controller_spec.rb存根這種方法:

User.any_instance.stubs(:before_save_callback_method).returns(true) #doesn't work 
User.any_instance.stubs(:valid?).returns(true) #works 

我怎樣才能做到這一點?

回答

2

你並不真的需要存根出before_save回調,而您可以存根出方法被稱爲回電話。您可以將行爲移動到方法和存根上。

before_save :downcase_email 

def downcase_email 
    self.email.downcase! 
end 

然後在您的規格:

user.stub(:downcase_email).and_return(true) 
+0

謝謝@beef生澀。它工作正常。 – alex

1

如果您使用的模擬,也可以這樣做

describe User 
    it "should accept email_downcase before save" do 
    user = mock(User) 
    user.should_receive(:email_down).and_return(email.downcase) # => use return in case you want to 
    end 
end 

感謝

+0

謝謝@Paritosh Singh。 不幸的是,它並沒有解決問題。因爲問題在'創建'後發生錯誤:undefined method'downcase!'爲零:NilClass。 @牛肉乾給了正確的答案。 – alex

-1

你真的需要before_save方法?也許它會更好,如果你重寫電子郵件=,所以電子郵件獲取剛剛分配之後downcased和你有downcased甚至保存記錄

User < ActiveRecord 
    def email=(value) 
    write_attribute(:email, value.downcase) 
    end 
end 

我不知道是否可以幫助你測試過,但有時候這比before_save回調更好