0

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

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

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

4

1 回答 1

3

这里有几个解决方案:

首先,您可以使用 VCR 之类的工具(Ryan Bates 对此有很好的截屏视频!)这样,您第一次运行测试时会记录来自 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

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

于 2013-03-14T20:59:51.977 回答