Rails验收测试 - 剔除外部服务调用

时间:2013-03-08 04:03:07

标签: ruby-on-rails ruby rspec capybara

我想知道是否可以存根外部服务。 我在我的应用程序中对外部服务进行了以下调用:

bitly = Bitly.new("someuser", "123key")
bitly.shorten("www.example.com/my_model/#{@my_model.id}")

在我的验收测试期间,是否可以在每次调用此服务时使用Bitly?

任何例子都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

我建议您查看Webmock,https://github.com/bblimke/webmock。我喜欢它的一件事是,它会为任何未被存根的出站http请求引发错误(并且还提供生成的示例代码来存根请求)。它也有很好的记录。

编辑:或者,不是删除实际的http请求,而是可以缩短缩短方法:

bitly = Bitly.new("someuser", "123key")
bitly.stub(:shorten).and_return("some value")
bitly.shorten("<some url>").should == "some value"

答案 1 :(得分:0)

您始终可以重新定义该类,并创建一个接受URL的新shorten方法。您还需要返回一个对您的代码有意义的值:

class Bitly

  def initialize(p1, p2)
    @p1, @p2 = p1, p2 # in case it's important to remember them
  end

  def shorten(url)
    "some return value"
  end

end

bitly = Bitly.new("someuser", "123key")
bitly.shorten("www.example.com/my_model/#{@my_model.id}")

即使您在声明之前包含了正常的Bitly文件,其后面的任何代码都将使用重新定义的类和方法。

可能还有很多其他更好的方法,但这很快(而且很脏)并且工作简单。

有时,您可以确定一种特定方法,该方法会阻碍所有外部服务的I / O,替换它,并利用代码提供的所有其他功能。这是我认为对Ruby很酷的事情之一。