#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
запрос, вам не нужно этого делать. Просто выполните запрос вместо сохранения выходных данных.