我的控制器中有一个连接到第三方api并执行某些操作的操作。如果代码成功,则保存我的用户。如果第三方api失败,则不保存用户。
def create
if ThirdPartyApp.connect.eql? true
User.create(params[:user])
else
redirect home_path
end
end
我想测试User.create
代码,而不必担心第三方应用代码。我知道存根和模拟并理解一个测试实例方法和其他类方法的区别。我不确定如何在我的rspec测试中使用它,因为在第三方应用程序工作所需的测试中无法满足某些条件。有关如何使用存根,模拟或其他方法编写此测试的任何帮助都会很棒。
答案 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
其他人可能会提出不同的解决方案,如果我在这种情况下做出选择,我会选择录像机。