Почему этот код Ruby выполняется при сбое теста? - PullRequest
0 голосов
/ 27 марта 2012

Я пытаюсь убедиться, что значение переменной не равно nil, прежде чем продолжить - это значение создается асинхронно в зависимости от активности запроса в экземпляре 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, и затем выйдите из блока till'.Что я сделал не так?Большое спасибо!

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Я не знаю, что возвращает ваш сервер, но я бы попробовал что-то вроде

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
0 голосов
/ 27 марта 2012

Если вы используете гем rest-client, 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 всегда имеет возвращаемое значение или выдает ошибку. Чтобы помочь вам, мне нужно знать больше информации о том, чего вы хотите достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...