NoMethodError: неопределенный метод `errors 'для []: Array - PullRequest
0 голосов
/ 08 мая 2018

Я получаю NoMethodError при запуске test для кода ниже

csv_importer.rb

require 'csv_importer/engine'

class WebImport
  def initialize(url)
    @url = url
  end

  def call
    url = 'http://example.com/people.csv'
    csv_string = open(url).read.force_encoding('UTF-8')

    string_to_users(csv_string)
  end

  def string_to_users(csv_string)
    counter = 0
    duplicate_counter = 0

    user = []
    CSV.parse(csv_string, headers: true, header_converters: :symbol) do |row|
      next unless row[:name].present? && row[:email_address].present?
      user = CsvImporter::User.create row.to_h
      if user.persisted?
        counter += 1
      else
        duplicate_counter += 1
      end
    end
    p "Email duplicate record: #{user.email_address} - #{user.errors.full_messages.join(',')}" if user.errors.any?

    p "Imported #{counter} users, #{duplicate_counter} duplicate rows ain't added in total"
  end
end

csv_importer_test.rb

require 'csv_importer/engine'
require 'test_helper'
require 'rake'

class CsvImporterTest < ActiveSupport::TestCase

  test 'truth' do
    assert_kind_of Module, CsvImporter
  end

  test 'should override_application and import data' do
    a = WebImport.new(url: 'http://example.com/people.csv')
    a.string_to_users('Olaoluwa Afolabi')# <-- I still get error even I put a comma separated list of attributes that is imported into the db here.
    assert_equal User.count, 7
  end
end

формат csv в URL в коде: Это сохраняет в БД после запуска Rake Task

Name,Email Address,Telephone Number,Website
Coy Kunde,stone@stone.com,0800 382630,mills.net

Что я сделал для отладки:

Я использую byebug, и я выяснил, в csv_importer_test.rb, строка, где у меня есть a.string_to_users('Olaoluwa Afolabi'), выдает ошибку. Смотри ошибку byebug ниже:

byebug error

Итак, когда я запускаю rails test, я получаю ошибку ниже:

test error

Итак, как мне решить эту ошибку, я понятия не имею, что я делаю неправильно ??

1 Ответ

0 голосов
/ 08 мая 2018

Если в вашем csv_string нет строки, эта строка:

user = CsvImporter::User.create row.to_h

не выполняется, поэтому переменная user содержит предыдущее значение, равное []:

user = []

Как мы знаем, для Array не определен метод errors, но вы пытаетесь вызвать его в этой строке:

p "Email duplicate record: #{user.email_address} - #{user.errors.full_messages.join(',')}" if user.errors.any?

, и поэтому вы получаете ошибку.

...