我有一个名为token wrapper的模块,其中有一个方法getToken
:
def Tokenwrapper.getToken
uri = URI.parse("[URL REDACTED]/api/authenticate")
request = Net::HTTP::Post.new(uri)
request.basic_auth("email@domain.com", "pass")
request.content_type = "application/json"
request["Accept"] = "application/json"
req_options = {
use_ssl: uri.scheme == "https",
}
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
http.request(request)
end
response
end
当我尝试使用以下断言进行测试时:
assert_equal("#<Net::HTTPOK:",Tokenwrapper.getToken[0..13])
我收到此错误:
NoMethodError: undefined method 'downcase' for 0..13:Range
我没有手动调用downcase方法,我也没有看到ruby应该自动执行的任何原因。为什么会发生这种情况?如何进行测试?
我会说实话,我不太了解HTTP API响应以及这个网络区域如何运作,所以我很感激任何资源以及这个问题的答案。
答案 0 :(得分:2)
响应对象的[]
方法provides access to a header from the response。当您尝试getToken[0..13]
时,这就是实际调用的方法。
此[]
期待调用response['Content-Type']
,并对传入的值使用downcase
,以便不区分大小写地处理标题名称。
如果要检查响应的字符串表示中的前几个字符,可以将响应转换为字符串并进行比较,如下所示:
assert_equal("#<Net::HTTPOK:",Tokenwrapper.getToken.to_s[0..13])
或者,您可以在HTTP状态代码上使用断言,例如
assert_equal(200, Tokenwrapper.getToken.code)