Условный регистр в ruby не вводится в when

#ruby #automated-tests #conditional-statements #httparty

#ruby #автоматические тесты #условные операторы #httparty

Вопрос:

Мой код при выполнении не вводится в цикл when внутри условия обращения. Я хотел отправить два разных запроса GET на основе * аргументов функции. Таким образом, я могу проверить ошибки, когда я не отправляю один из параметров в запросе. Если у кого-то есть лучшая логика для выполнения этого одним методом, я тоже одобряю.

Вот мой код:

 def get_function(access_token,order1,order2,*args)
    case args
      when  args = "order1"
        self.class.get("/v1/apiendpoint?order2=#{order2}",
                   headers: {'accesstoken': "#{access_token}"})
      when args = "order2"
        self.class.get("/v1/apiendpoint?order1=#{order1}",
                   headers: {'accesstoken': "#{access_token}"})
    end
  end
 

Когда я выполняю с помощью binding.pry (debugging), он показывает эту часть и не выполняет остальную часть кода.

 From: C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/cucumber-core-8.0.1/lib/cucumber/core/test/action.rb @ line 25 Cucumber::Core::Test::Action#execute:

22: def execute(*args)
23:   @timer.start
24:   @block.call(*args)
==> 25:   passed
26: rescue Result::Raisable => exception
27:   exception.with_duration(@timer.duration)
28: rescue Exception => exception
29:   failed(exception)
30: end
 

Ответ №1:

Здесь есть несколько проблем:

 case args
when  args = "order1"
 

Во-первых, args это Array — поэтому оно не может быть равно a String . Я не уверен, что вы намеревались здесь сделать, поэтому не могу точно сказать, как это исправить.

Во-вторых, = является оператором присваивания, в то == время как выполняет проверку на равенство.

И, наконец, это case оператор, а не if оператор, поэтому на самом деле вы не должны выполнять проверку равенства здесь… Любой из них имел бы синтаксический смысл:

 case args
when "order1"
   # ...
end

# OR:

case
when args == "order1"
  # ...
end
 

Также обратите внимание, что описание вашего вопроса немного сбивает с толку. Вы сказали:

цикл when

но это не цикл. Вы могли бы назвать это «предложением» или «заявлением», но это, конечно, не «цикл».

Ответ №2:

Следуя Tom help, решил перейти к IF statement .

Вот что сработало:

 def get_function(access_token,order1,order2,*args)

 if args == ["order1"]
          self.class.get("/v1/apiendpoint?order2=#{order2}",
            headers: {'accesstoken': "#{access_token}"})
            else
              self.class.get("/v1/apiendpoint?order1=#{order1}",
                headers: {'accesstoken': "#{access_token}"})
        end
 

Комментарии:

1.Я думаю, что я не совсем понял вопрос, когда я ответил. Вы пытаетесь проверить, предоставил ли пользователь значение для параметра order1 или пользователь предоставил его в String "order1" качестве параметра функции?

2. эй … второй вариант. Если он получает "order1" , сделайте что-нибудь…

3. Хорошо, итак, мой ответ применим концептуально, поскольку я проверяю String равенство 🙂

Ответ №3:

args является Array аргументом of , поэтому сравнение его с a String всегда будет оценивать false , независимо от String .

Я не знаю точно, что вам нужно с точки зрения поведения функции, но я могу сказать, что если вы хотите заглянуть внутрь args Array , чтобы сравнить каждый аргумент с a String , возможно, было бы лучше перебрать массив.

Пример с if :

 def args_example(*args)
  # Working directly with *args doesn't work, so we assign it to arguments
  arguments = *args

  # We need a way to save the output after the if clause
  output = []

  # Let's iterate!
  arguments.each do |argument|

    # This is where the if would come in
    if argument == "One"
      output << 1
    elsif argument == "Two"
      output << 2
    else
      output << 0
    end
  end

  output
end
 
 args_example("One", "Two", "Three")

=> [1, 2, 0]
 

Пример с case :

 def args_example(*args)
  # Working directly with *args doesn't work, so we assign it to arguments
  arguments = *args
  
  # We need a way to save the output after the case clause
  output = []

  # Let's iterate!
  arguments.each do |argument|

    # This is where the case would come in
    case argument
    when "One"
      output << 1
    when "Two"
      output << 2
    else
      output << 0
    end
  end

  output
end
 
 args_example("One", "Two", "Three")

=> [1, 2, 0]
 

Это один из способов проверить все аргументы, предоставленные функции (наверняка есть более короткий способ), и отправить GET соответствующий запрос.

Приветствия! 🇧🇷

ПРИМЕЧАНИЕ: я сохранил вывод, чтобы иметь возможность его отображать, но я понял, что, поскольку вы только выполняете GET запрос, вам не нужно этого делать. Просто выполните запрос вместо сохранения выходных данных.