【问题标题】:Mocking a non database backed model in Rails with Rspec使用 Rspec 在 Rails 中模拟非数据库支持的模型
【发布时间】:2011-05-30 10:26:51
【问题描述】:

我正在尝试根据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

任何指针?

【问题讨论】:

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


    【解决方案1】:

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

    尝试改变

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

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

    【讨论】:

    • 感谢安迪的回复。 any_instance 方法在 Rspec 2.6 及更高版本中可用。我正在使用 2.0.0。我能够通过调整我的测试代码和关于#RubyOnRails 的一些讨论来解决这个问题。然而,上面也解决了这个问题,但仅限于 Rspec >=2.6。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多