2013-04-09 54 views
2

如何存根存取我有下面的类:使用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_lengthTwitter::Configuration是没有得到存根。我做错了吗?我试图实现的所有功能都能够运行我的TwitterService#get_short_url_length方法,而无需运行Twitter库,这会导致对Twitter的API请求导致失败。

我使用以下工具:

  • 的Rails 3.2.12
  • Rspec的2.13.0
  • Twitter的4.6.2

任何帮助,不胜感激!

回答

0

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

无论如何,我认为更好的方式来做到这将是注入配置到你的代码,即

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

这可以是一个测试双(模拟或存根),或使用,如果真正的服务没有指定。

+0

当设置了认证数据时,@ twitter.configuration是Twitter :: Configuration的一个实例。在Rails控制台中,如果我运行'Twitter.configuration',它实际上会直接使用Twitter进行身份验证。我认为这就是为什么我不能在其上存储方法的原因。我也无法将配置作为参数传递,因为它是Twitter模块的一部分。 – sudoash 2013-04-10 08:45:19