Rails / RSpec:如何使用第三方API测试Rails操作?

时间:2016-02-26 08:23:45

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

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结果以验证短消息。

如何测试创建操作?感谢

3 个答案:

答案 0 :(得分:1)

你可以在你的情况下使用外部api调用的stub方法,即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

答案 1 :(得分:0)

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

https://github.com/vcr/vcr

答案 2 :(得分:0)

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

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