2011-05-30 67 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)