繁体   English   中英

使用 MiniTest 在 class 中模拟方法

[英]Mock method in class using MiniTest

我在使用 Ruby 的 MiniTest::Mock 和存根功能的 class 中遇到了一个问题 mocking 方法,这让我发疯了。 我正在尝试做的是通过调用 Ruby API 来设置获取访问令牌的方法,该方法将从第 3 方站点获取实际访问令牌。

这是 class 所有工作都将在其中完成。

class ThisClass
  attr_reader :hauler

  def initialize(hauler)
    @hauler = hauler
  end

  def get_access_token
    access_token = Rails.cache.read("access_token_#{hauler.id}")

    if access_token.blank?
      access_token = ext_access_token
      Rails.cache.write("access_token_#{@hauler.id}", access_token, { expires_in: 3600 })
    end
    
    access_token
  end
  
  def ext_access_token
    # call to external url to get access_token
    # Successful response will be { "data": { "authToken": "new-token"} }"
    url = URI.parse("http://www.fake-login.com/auth/sign_in")
    res = Net::HTTP.post_form(url, "userName" => @hauler[:client_id], "password" => @hauler[:client_secret])
    json_response = JSON.parse(res.body)
    json_response["data"]["authToken"]
  end

end

测试如下

class ThisClassTest < ActiveSupport::TestCase
  test "Get Access Token" do
    hauler = haulers(:one)
    tc = ThisClass.new(hauler)
    mock_client = MiniTest::Mock.new
    mock_client.expect :ext_access_token, "\"{ \"data\": { \"authToken\": \"new-token\"} }\""

    ThisClass.stub(:ext_access_token, mock_client) do
      puts tc.get_access_token
    end 
    assert_equal true, true
  end
end

当我运行测试时,出现以下错误

Error:
ThisClassTest#test_Get_Access_Token:
NameError: undefined method `ext_access_token' for class `ThisClass'

我显然做错了什么,因为我想要的只是让ext_access_token方法返回相同的数据字符串,这样我就可以针对它运行逻辑,但是非常失败。 ThisClass 相当简单,但概述了我将根据来自外部站点的返回为更复杂的方法前进的设置。

测试找不到ext_access_token方法,因为它在 ThisClass 上寻找ThisClass方法,而不是实例方法。

所以你需要的是

    tc.stub :ext_access_token, mock_client do
      puts tc.get_access_token
    end 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM