[英]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.