Ruby - неявное преобразование Array в String - PullRequest
0 голосов
/ 07 ноября 2018

Я получаю сообщение об ошибке при выполнении теста.

 Failure/Error: expect(industry_sic_code).to include page.sic_code

 TypeError:
   no implicit conversion of Array into String
 # ./spec/os/bal/company/company_filter_clean_harbors_industries_stub.rb:62:in `block (2 levels) in <top (required)>'

Метод:

def sic_code
  subtables = @b.table(:class => 'industry-codes').tables(:class => 'industry-code-table')
  subtables.each do |subtable|
    if subtable.tbody.h4.text == "US SIC 1987:"
      subtable.tr.next_siblings.each do |tr|
       codes = tr.cell
       puts codes.text.to_s
      end
    end
  end
end

Тест:

  it 'Given I search for a random Clean Harbors Industry' do

  #Pick a random clean industry from the file
    data = CSV.foreach(file_path, headers: true).map{ |row| row.to_h }
    random = data.sample

    random_industry = random["Class"]
    industry_sic_code = random["SIC Code"]
  end

  it 'Then the result has the expected SIC code' do
    page = DetailPage.new(@b)
    page.view

    expect(industry_sic_code).to include page.sic_code
  end

Я пытался неявно изменить каждую переменную на строку, но он по-прежнему жалуется на проблему с массивом.

Когда я включаю некоторые пут-листы, я получаю некоторые действительно странные ответы. Сам метод возвращает ожидаемый результат.

Когда я использовал метод в тесте, я получаю приведенный ниже код.

here are the sic codes from the method
5511

Here are the codes from the test
#<Watir::Table:0x00007fa3cb23f020>
#<Watir::Table:0x00007fa3cb23ee40>
#<Watir::Table:0x00007fa3cb23ec88>
#<Watir::Table:0x00007fa3cb23ead0>
#<Watir::Table:0x00007fa3cb23e918>
#<Watir::Table:0x00007fa3cb23e738>
#<Watir::Table:0x00007fa3cb23e580>

1 Ответ

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

Ваш метод sic_code возвращает массив subtables, поэтому у вас есть эта ошибка. Неважно, что метод что-то помещает, каждый метод в ruby ​​неявно возвращает результат своей последней строки, в вашем случае это subtables.each do ... end, поэтому у вас есть массив.

Вам необходимо явно вернуть необходимое значение. Не уверен, правильно ли я понял, что вы делаете в своем коде, но попробуйте что-то вроде этого:

def sic_code
  subtables = @b.table(:class => 'industry-codes').tables(:class => 'industry-code-table')
  result = [] # you need to collect result somewhere to return it later
  subtables.each do |subtable|
    if subtable.tbody.h4.text == "US SIC 1987:"
      subtable.tr.next_siblings.each do |tr|
        codes = tr.cell
        result << codes.text.to_s
      end
    end
  end
  result.join(', ') 
end
...