Ruby测试assert_equal报错:0..13:Range无downcase方法(附Tokenwrapper代码)
undefined method 'downcase' for 0..13:Range in Tokenwrapper Test Let's break down what's happening here and fix it step by step.
First, that error message tells us exactly where the problem lies: somewhere in your code (most likely your test) a Range object (0..13) is being passed to a method that expects a string, and that method is trying to call downcase on it. Since ranges don't have a downcase method, Ruby throws that error.
The Root Cause (Likely)
Looking at your Tokenwrapper.getToken method, it returns the full Net::HTTP::Response object—not the actual token or response body content. Here's the critical part:
- If your test code is doing something like
response[0..13](trying to grab a substring of the response), you're actually callingNet::HTTP::Response#[], which is meant to fetch HTTP headers (e.g.,response["Content-Type"]). When you pass a range like0..13to this method, it tries to normalize the header name by callingdowncaseon it—hence the error, because ranges don't support that method.
Fixes to Apply
1. Update getToken to Return Useful Data
Right now, your method returns the entire HTTP response object. You probably want it to return the parsed token from the response body. Modify the method like this:
require 'json' # Make sure you have this required at the top of your file 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 # Parse the JSON response body and extract the token if response.success? JSON.parse(response.body)["token"] # Adjust this key to match your API's response else # Handle errors (optional, but good practice) nil end end
2. Fix Your Test Code
Make sure your test is asserting against the right data type and accessing the response content correctly:
- If you were trying to check a substring of the response body, use
response.body[0..13]instead ofresponse[0..13] - If you're testing the token itself, assert against the value returned by the updated
getTokenmethod
Example test:
test "getToken returns a valid token string" do token = Tokenwrapper.getToken assert_not_nil token, "Token should not be nil" assert_kind_of String, token, "Token should be a string" # If you have a known test token, you can add: # assert_equal "your_test_token_here", token end
3. Double-Check for Accidental Range Usage
Scan your test code for any place where you might be passing a range (like 0..13) to a method that expects a string. Common mistakes include:
- Accidentally using
response[0..13]instead ofresponse.body[0..13] - Passing a range as a header name or string argument elsewhere in your test
Final Notes
Always remember that Net::HTTP::Response objects are not strings—they encapsulate the entire HTTP response (headers, status code, body, etc.). To work with the actual content returned by the API, you need to access the body attribute and parse it if it's JSON.
内容的提问来源于stack exchange,提问作者P KO

