簡體   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