Как вернуть массив массивов, который содержит хэши - PullRequest
0 голосов
/ 27 января 2020

Это мой метод, который вызывается тестовой функцией:

def movies_with_directors_set(source)       
  director = []
  director1 = []
  hash = {}

  while outer_index < source.length do
    inner_index = 0

    while inner_index < source[outer_index][:movies].length do
      hash[:title] = []
      hash[:title] = source[outer_index][:movies][inner_index][:title]
      hash[:director_name] = []
      hash[:director_name] = source[outer_index][:name]

      director1 << hash.dup

      inner_index +=1
    end

    director <<  director1.dup 

    outer_index += 1
  end


  return director
end

Это тестовый код:

 describe 'movies_with_directors_set' do
  describe 'when given a Hash with keys :name and :movies,' do
    describe 'returns an Array of Hashes that represent movies' do
      describe 'and each Hash has a :director_name key set with the value that was in :name' do
        # This lets "sample_data" be used in the two "it" statements below
        let (:test_data) {
          [
            { :name => "Byron Poodle", :movies => [
              { :title => "At the park" },
              { :title => "On the couch" },
            ]
            },
            { :name => "Nancy Drew", :movies => [
              { :title => "Biting" },
            ]
            }
          ]
        }

        it 'correctly "distributes" Byron Poodle as :director_name of the first film' do
          # { :name => "A", :movies => [{ :title => "Test" }] }
          # becomes... [[{:title => "Test", :director_name => "A"}], ...[], ... []]
          results = movies_with_directors_set(test_data)
          expect(results.first.first[:director_name]).to eq("Byron Poodle"),
            "The first element of the AoA should have 'Byron Poodle' as :director_name"
        end

        it 'correctly "distributes" Nancy Drew as :director_name of the last film' do
          results = movies_with_directors_set(test_data)
          expect(results.last.first[:director_name]).to eq("Nancy Drew"),
            "The last element of the AoA should have 'Nancy Drew' as :director_name"
        end
      end
    end
  end
end

Мой метод возвращает массив хэшей, но по какой-то причине он не хочет проходить тест, поскольку говорит, что вторая часть теста не пройдена.

Возможно, для этого требуются массивы в массиве из-за того, как сформулирован тест.

source - база данных, которая передается в метод. Эта конкретная c база данных отображается в тестовом коде.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Если вы хотите преобразовать структуру из вложенного имени директора / заголовков в пары директор-имя / заголовок, есть гораздо более простой способ сделать это. Сила Ruby в Enumerable библиотеке , которая делает преобразование данных действительно быстрым, эффективным и простым для express. Вот подход, который стоит использовать:

def movies_with_directors(source)
  # flat_map will join together the inner arrays into a single contiguous array
  source.flat_map do |set|
    set[:movies].map do |movie|
      {
        director_name: set[:name],
        title: movie[:title]
      }
    end
  end
end

Это дает очень плоскую, простую для навигации структуру, подобную этой:

# => [{:director_name=>"Byron Poodle", :title=>"At the park"}, {:director_name=>"Byron Poodle", :title=>"On the couch"}, {:director_name=>"Nancy Drew", :title=>"Biting"}]

, где вы можете перебирать и утверждать более легко, без необходимости do .first.first и т. п.

При использовании Ruby всегда старайтесь мыслить с точки зрения преобразования данных , а не с точки зрения циклов. В библиотеке Enumerable имеется множество инструментов, которые могут выполнять сложные операции с помощью одной строки кода. В вашем случае вам понадобилась комбинация flat_map и map, и все готово.

1 голос
/ 27 января 2020

Ваши тестовые данные и ожидаемые результаты теста не совпадают c.

У вас есть ключ :name, и вы ожидаете, что в вашем тесте будет присутствовать :director_name ha sh. Измените :director_name на :name, и оно должно пройти:

{ :name => "Nancy Drew", :movies => [

и

expect(results.last.first[:director_name]).to eq("Nancy Drew")

Так что ваш тест на неудачу, вероятно, говорит что-то вроде expected nil to be "Nancy Drew", верно?

...