是否需要使用第三方api进行存根/嘲弄

时间:2013-03-14 20:02:58

标签: ruby-on-rails ruby-on-rails-3 rspec controller rspec2

我的控制器中有一个连接到第三方api并执行某些操作的操作。如果代码成功,则保存我的用户。如果第三方api失败,则不保存用户。

def create
  if ThirdPartyApp.connect.eql? true
    User.create(params[:user])
  else
    redirect home_path
  end
end

我想测试User.create代码,而不必担心第三方应用代码。我知道存根和模拟并理解一个测试实例方法和其他类方法的区别。我不确定如何在我的rspec测试中使用它,因为在第三方应用程序工作所需的测试中无法满足某些条件。有关如何使用存根,模拟或其他方法编写此测试的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:3)

这里有一些解决方案:

首先,您可以使用像VCR这样的工具(Ryan Bates对此有一个great screencast!)这样,您第一次运行测试时会记录API的响应,以便从第二次开始之后它只是'重播''录音'以使用他们的条款。

对依赖于API响应的请求使用存根/模拟可能很困难。如果是我(我猜你是如何测试这个控制器动作的)

it "creates user" do
  ThirdPartyApp.any_instance.stub(:connect) { true }
  # fill in form or submit params as required
  User.count.should == 1 # or some other assertion
end

然后你可以测试失败:

it "fails from the api" do
  ThirdPartyApp.any_instance.stub(:connect) { false }
  # fill in form or submit params as required
  current_path.should == '/whatever' # or some other assertion
end

其他人可能会提出不同的解决方案,如果我在这种情况下做出选择,我会选择录像机。