【问题标题】:Rails / RSpec: How to test Rails action with third party API?Rails / RSpec:如何使用第三方 API 测试 Rails 操作?
【发布时间】:2016-02-26 08:23:45
【问题描述】:
class SessionsController < ApplicationController::Base  
  def create
      result = verify_sms_code(params[:session][:phone], params[:session][:code]
       if result['code'] == 200
         render json: {code: 200, msg: 'success'}
       else
         render json: {code: 404, msg: 'failed'}
       end
    end
end

verify_sms_code方法从网络调用第三方API,API返回JSON结果为验证短信。

如何测试创建操作?谢谢

【问题讨论】:

    标签: ruby-on-rails unit-testing rspec


    【解决方案1】:

    在您的情况下,您可以存根方法进行外部 api 调用,即 verify_sms_code。你可以写类似

    SessionsController.any_instance.stub(:verify_sms_code).and_return({code: 200, data: ''})
    

    当您在 SessionsController 中使用 verify_sms_code 时编写上述代码时,它将返回您提供的哈希值,即{code: 200, data: ''}

    如果您使用的是 rspec 3 及更高版本,您可以在控制器内部模拟 verify_sms_code 如下。

    allow(controller).to receive(:verify_sms_code).and_return({code: 200, data: ''})
    

    参考链接:

    https://www.relishapp.com/rspec/rspec-mocks/v/2-6/docs/method-stubs/stub-on-any-instance-of-a-class

    http://rspec.info/documentation/3.4/rspec-mocks/

    还有其他模拟方式。检查以下链接

    https://robots.thoughtbot.com/how-to-stub-external-services-in-tests

    例子:

    it "does something" do   
      SessionsController.any_instance.stub(:verify_sms_code).and_return({code: 200, data: "success data"})
    end
    
    it "does other thing" do 
       SessionsController.any_instance.stub(:verify_sms_code).and_return({code: 404, data: "error data"})
    end
    

    【讨论】:

    • 但是如何改变返回值呢?出于某种原因,我想在其他示例中返回 {code:404},但 SessionsController.any_instance.stub(:verify_sms_code).and_return({code: 200, data: ''}) 在所有示例中都返回 {code: 200, data:""}
    • @Ryman1981 用示例更新了我的答案。如果您需要在不同的示例中返回不同的响应,则必须在每个示例基础上对其进行存根
    • 从 RSpec 3.3 开始, any_instance 已被弃用且不推荐使用。我使用allow(controller).to receive(:verify_sms_code).and_return({code: 200, data: 'success data'}, {code: 404, data: 'error data'}),但它只返回第一个响应
    • 感谢您的信息。我将使用 rspec 3.3 的新方法更新我的答案
    【解决方案2】:

    我使用 VCR gem 来测试进行 API 调用的操作。 它允许您记录 API 响应以在测试中使用它们。

    https://github.com/vcr/vcr

    【讨论】:

      【解决方案3】:

      我使用webmock 并且非常喜欢它。我对标题、参数、返回内容、返回标题、返回状态等有很多控制权。但是,开销并不大。

      我将我所有的stub_requests 放入一组共享文件中,然后通过rails_helper.rb 将它们全部包含在内。这样,我可以在整个测试套件中重复使用我的stub_requests

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        相关资源
        最近更新 更多