未定义的方法' host'在rspec

时间:2015-09-21 19:39:25

标签: ruby rspec

我在Ruby脚本中有以下方法:

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 

手动测试url工作正常(返回true,因为url确实有效):

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

但是,当我尝试在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 

它给了我这个错误

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

url是host对象,您正在尝试访问String中不存在的名为url = “#{endpoint}#{fname}” req = Net::HTTP.new(url.host, url.port) 的方法:

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" 

编辑您可能需要一个URI对象。我想这就是你想要的:

url = URI.parse url

所以只需在使用url.host之前添加var tables = document.querySelectorAll("table") var elementToMove = tables[0].rows[0].cells[0] var destination = tables[2].rows[0].cells[0] destination.innerHTML = elementToMove.innerHTML elementToMove.innerHTML = ""

答案 1 :(得分:1)

  

手动测试url工作正常(返回true,因为url确实有效):

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

当您测试上面的代码(可能是测试旧版本)时,您似乎错过了一些东西,因为它现在无法正常工作。

看看这些代码行:

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

您正在从其他两个变量urlendpoint创建字符串变量fname。到现在为止还挺好。

但是,您尝试访问host变量上的方法url,该变量不存在(但它存在于endpoint变量上),这就是您收到此错误的原因

您可能希望使用此代码:

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