2011-05-30 40 views
0

我想根據http://railscasts.com/episodes/121-non-active-record-model在我的Ruby on Rails應用程序中創建一個非ActiveRecord模型。儘管如此,我仍然很難測試它。用Rspec在Rails中嘲諷非數據庫支持的模型

我在我的app/models/sms.rb文件中有以下類。

class Sms 
    def initialize 
    # Do stuff here 
    end 

    def deliver 
    # Do some stuff here 
    end 
end 

我無法在我的Sms類上模擬傳遞方法。

it 'should do someting' do 
    @sms = mock(Sms) 
    @sms.should_receive(:deliver).and_return(true) 

    post :create, :user_id => @user.id 
    flash[:notice].should == "SMS sent successfully." 
    response.should redirect_to(some_url) 
end 

在我的控制器代碼中,我確實有一行表示@sms.deliver。然而上面給出了以下錯誤:

Failure/Error: @sms.should_receive(:deliver).and_return(true) 
     (Mock Sms).deliver(any args) 
     expected: 1 time 
     received: 0 times 

任何指針?

回答

2

以@開頭的變量是實例變量。您的控制器引用的@sms與您的規範定義的@sms不同。

嘗試改變

@sms = mock(Sms) 
@sms.should_receive(:deliver).and_return(true) 

Sms.any_instance.should_receive(:deliver).and_return(true) 
+0

謝謝Andy的迴應。 'any_instance'方法在Rspec 2.6及更高版本中可用。我正在使用2.0.0。我能夠通過調整我的測試代碼和關於#RubyOnRails的一些小討論來解決這個問題。但是,上面也解決了這個問題,但只在Rspec> = 2.6。 – Waseem 2011-05-30 13:31:46

2

如果RSpec的版本不具備any_instance方法,你需要在類存根:new

@sms = mock(Sms) 
Sms.stub(:new).and_return(@sms) 
@sms.should_receive(:deliver).and_return(true)