如何使用rspec存根访问器

时间:2013-04-09 20:26:58

标签: ruby-on-rails ruby rspec

我有以下课程:

class TwitterService
  def initialize
    @twitter ||= Twitter
  end

  def get_short_url_length
    @twitter.configuration.short_url_length
  end
end

以下规格:

describe TwitterService do
  before(:each) do
    Twitter::Configuration.any_instance.stub(:short_url_length).and_return(12)
  end

  it 'does not send short_url_length request to Twitter' do
    twitter = TwitterService.new
    twitter.get_short_url_length.should == 12
  end
end

我遇到的问题是#short_url_length上的Twitter::Configuration没有被删除。我做错了吗?我想要实现的只是能够在不运行Twitter库的情况下运行我的TwitterService#get_short_url_length方法,这会导致对Twitter的API的请求导致失败。

我正在使用以下工具:

  • Rails 3.2.12
  • Rspec 2.13.0
  • Twitter 4.6.2

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

在您的实施中,您确认@ twitter.configuration实际上是Twitter :: Configuration的实例吗?

无论如何,我认为更好的方法是在你的代码中注入一个配置,即

def initialize(config = Twitter::Configuration)
  @twitter ||= config
end

这可以是测试双(模拟或存根),或者如果没有指定则使用实际服务。