为什么这个Ruby代码在测试失败时执行?

时间:2012-03-27 11:37:46

标签: ruby

我正在尝试确保变量值在继续之前是非零的 - 根据Sinatra实例的请求活动异步实例化该值

attr_accessor :access_token

until !@access_token.nil?
  @access_token = RestClient.get @callback_URI + '/access_token/' + @request_Id 
end

puts @access_token #=> always get output even if @access_token is nil

我的理解是表达式意味着:'继续将RestClient调用的值赋给@access_token,直到它返回非nil值,然后退出until块'。我做错了什么?非常感谢!

2 个答案:

答案 0 :(得分:1)

我不知道你的服务器返回了什么,但我会尝试类似的东西,

while true
   begin
      @access_token = RestClient.get @callback_URI + '/access_token/' + @request_Id
      break if @access_token.code == 200
   rescue
      $stderr.puts "failed to get access token"
   end
   sleep 1
end

答案 1 :(得分:0)

假设您使用的是rest-client gem,RestClient在失败的请求中不会返回nil。例如:

require 'rest_client'
puts RestClient.get "http://invalidurl.foo/somepath"

从我的提供商处产生错误页面(不是nil):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
 <head>
    <title>T-Online Navigationshilfe</title>
 </head>
 <frameset rows="100%">
 <frame src="http://navigationshilfe.t-online.de/dnserror?url=http://invalidurl.foo/"
    frameborder="0" noresize="noresize"/>
 <noframes>
  <body>
   <h1>Willkommen bei T-Online</h1>
   <p>
    <a href="http://navigationshilfe.t-online.de/dnserror?url=http://invalidurl.foo/">
    weiter....</a>
   </p>
  </body>
 </noframes>
 </frameset>
</html>

没有互联网连接,此代码会产生错误消息:

http.rb:762:in `initialize': getaddrinfo: nodename nor servname provided, or not known (SocketError)

这意味着您的until - 块始终只执行一次,因为RestClient#get始终具有返回值或抛出错误。为了帮助您,我需要了解您想要完成的更多细节。