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