Ruby - устанавливает пары ключ-значение внутри массива хэшей - PullRequest
0 голосов
/ 28 ноября 2018

Проблема в том, что у меня есть метод

def comparison_reporter(list_of_scenarios_results1, list_of_scenarios_results2)
  actual_failed_tests = list_of_scenarios_results2.select {|k,v| v == 'Failed'}
  actual_passed_tests = list_of_scenarios_results2.select {|k,v| v == 'Passed'}
  failed_tests = Array.new(actual_failed_tests.length) { Hash.new }
  failed_tests.each do |hash|
      actual_failed_tests.keys.map {|name| hash["test_name"] = name}
      actual_failed_tests.values.map {|new_status| hash["actual_status"] = new_status}
      list_of_scenarios_results1.values_at(*actual_failed_tests.keys).map {|old_status| hash["previous_status"] = old_status}
  end
  final_result = {
    "passed_tests_count" => list_of_scenarios_results2.select {|k,v| v == 'Passed'}.length,
    "failed_tests_count" => list_of_scenarios_results2.select {|k,v| v == 'Failed'}.length,
    "failed_tests" => failed_tests
  }
  return final_result
end

Этот метод принимает 2 хэша в качестве аргументов и возвращает результат их сравнения и некоторые другие вещи.В настоящее время он всегда возвращает failed_tests с двумя (или более) одинаковыми хешами (одинаковыми парами ключ-значение).Я думаю, что эта проблема находится где-то в блоке failed_tests.each do |hash|, но я не могу найти причину этой ошибки, пожалуйста, совет.Пример результата метода (в формате .json)

{
  "passed_tests_count": 3,
  "failed_tests_count": 2,
  "failed_tests": [
    {
      "test_name": "As a user I want to use Recent searches tab",
      "actual_status": "Failed",
      "previous_status": "Failed"
    },
    {
      "test_name": "As a user I want to use Recent searches tab",
      "actual_status": "Failed",
      "previous_status": "Failed"
    }
  ]
}

UPD: hash1 (первый аргумент) -

{""=>"Passed",
"As a new user I want to use no fee rentals tab"=>"Passed",
"As a new user I want to use Luxury rentals tab"=>"Passed", 
"As a user I want to use Recent searches tab"=>"Failed",
"As a user I want to use new listings for you tab"=>"Passed"}

hash2 (второй аргумент) -

{""=>"Passed",
"As a new user I want to use no fee rentals tab"=>"Failed",
"As a new user I want to use Luxury rentals tab"=>"Passed",
"As a user I want to use Recent searches tab"=>"Failed",
"As a user I want to use new listings for you tab"=>"Passed"}

Пример желаемого желаемого выхода:

{ 
"passed":"count",
"failed":"count",
"failed_tests": [
   {"test_name":"As a user I want to use Recent searches tab",
    "actual_status":"failed",
    "previous_status":"failed"},
   {"test_name":"As a new user I want to use no fee rentals tab",
    "actual_status":"failed",
    "previous_status":"passed"}]
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Проблема в строке 8: вы перезаписываете hash["previous_status"] последним значением в list_of_scenarios_results1.values_at(*actual_failed_tests.keys) при отображении на него.

Обычно вы используете карту, чтобы назначить итерируемое чему-либо, а не модифицироватьчто-то другое.например,
x = ['1','2','3'].map(&:to_i)
, а не
x = []; ['1','2','3'].map {|v| x << v.to_i}

Я бы предложил переосмыслить ваш подход.Будете ли вы всегда иметь одинаковые ключи в обоих хешах?Если это так, вы могли бы упростить это.Я бы также предложил заглянуть в byebug .Это интерактивный отладчик, который позволит вам пройтись по своей функции и увидеть, что происходит не так, как вы ожидаете.

0 голосов
/ 28 ноября 2018

Решение:

def comparison_reporter(before, after)
  failed_tests = after.select { |k,v| v == "Failed" }.map do |k,v|
    {
      test_name: k,
      actual_status: v,
      previous_status: before[k]
    }
  end

  {
    passed: after.size - failed_tests.size,
    failed: failed_tests.size,
    failed_tests: failed_tests
  }
end

Упрощенно failed_tests совсем немного.Так как мы рассчитываем количество неудачных тестов, мы можем использовать его для окончательного подсчета, вместо того, чтобы повторять хеш снова.

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