cvoep28
cvoep28

Reputation: 423

Undefined method 'host' in rspec

I have the following methods in a Ruby script:

def parse_endpoint(endpoint)
    return URI.parse(endpoint) 
end 

def verify_url(endpoint, fname)
    url = “#{endpoint}#{fname}” 
    req = Net::HTTP.new(url.host, url.port)     
    res = req.request_head(url.path) 
    if res.code == “200” 
        true 
    else 
        puts “#{fname} is an invalid file” 
        false
    end 
end 

Testing the url manually like so works fine (returns true since the url is indeed valid):

endpoint = parse_endpoint('http://mywebsite.com/mySubdirectory/')
verify_url(endpoint, “myFile.json”)  

However, when I try to do the following in rspec

describe 'my functionality' 

    let (:endpoint) { parse_endpoint(“http://mywebsite.com/mySubdirectory/”) } 

    it 'should verify valid url' do 
        expect(verify_url(endpoint, “myFile.json”).to eq(true))
    end 
end 

it gives me this error

“NoMethodError:
undefined method `host' for "http://mysebsite.com/mySubdirectory/myFile.json":String” 

What am I doing wrong?

Upvotes: 1

Views: 2601

Answers (2)

Aleksey Shein
Aleksey Shein

Reputation: 7482

Testing the url manually like so works fine (returns true since the url is indeed valid):

endpoint = parse_endpoint('http://mywebsite.com/mySubdirectory/')
verify_url(endpoint, “myFile.json”)  

It seems you missed something when you tested code above (maybe you tested old version) because it can't work as it is now.

Look at these lines of code:

url = "#{endpoint}#{fname}"
req = Net::HTTP.new(url.host, url.port)     

You're creating a string variable url from other two variables endpoint and fname. So far, so good.

But then you're trying to access method host on url variable, which doesn't exist (but it exists on the endpoint variable), that's why you get this error.

You may want to use this code instead:

def verify_url(endpoint, fname)
  url = endpoint.merge(fname)
  res = Net::HTTP.start(url.host, url.port) do |http|
    http.head(url.path)
  end
  # it's actually a bad idea to puts some text in a query method
  # let's just return value instead
  res.code == "200"
end 

Upvotes: 1

Leo Brito
Leo Brito

Reputation: 2051

url is a String object, and you are trying to access a method called host which does not exist in String:

url = “#{endpoint}#{fname}” 
req = Net::HTTP.new(url.host, url.port)   

EDIT you probably need an URI object. I think this is what you want:

2.2.1 :004 > require 'uri'
 => true 
2.2.1 :001 > url = 'http://mywebsite.com/mySubdirectory/'
 => "http://mywebsite.com/mySubdirectory/" 
2.2.1 :005 > parsed_url = URI.parse url
 => #<URI::HTTP http://mywebsite.com/mySubdirectory/> 
2.2.1 :006 > parsed_url.host
 => "mywebsite.com" 

So just add url = URI.parse url before using url.host.

Upvotes: 2

Related Questions