【问题标题】:Is stubbing/mocking necessary with 3rd party api3rd 方 api 是否需要存根/模拟
【发布时间】:2013-03-14 20:02:57
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这里有几个解决方案:

    首先,您可以使用 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
    

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

    【讨论】:

    • 嗯,这个项目确实有 VCR,我只是还没有在我的测试中采用它。会调查的。谢谢。如果没有人提出更好的答案,我会在一两天内给出答案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2010-09-27
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2020-12-08
    相关资源
    最近更新 更多