使用Rspec在Rails中模拟非数据库支持的模型

时间:2011-05-30 10:26:51

标签: ruby-on-rails ruby unit-testing rspec rspec2

我试图根据http://railscasts.com/episodes/121-non-active-record-model在我的Ruby on Rails应用程序中创建一个非ActiveRecord模型。我现在很难测试它。

我的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 个答案:

答案 0 :(得分:2)

以@开头的变量是实例变量。控制器引用的@sms与规范定义的@sms不同。

尝试更改

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

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

答案 1 :(得分:2)

如果你的RSpec版本没有any_instance方法,你需要在课程上存根:new

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