написание юнит-теста для граблей - PullRequest
0 голосов
/ 07 мая 2018

У меня есть простое приложение rails, в которое я импортирую данные из csv в мое приложение rails, которое работает нормально, но я не знаю, с чего начать тестирование этой задачи rake, а также где в модульном приложении rails. Любая помощь будет оценена. Спасибо!

csv_importer.task

require 'csv_importer/engine'

task users: :environment do
  desc 'Import users from csv'

  WebImport.new(url: 'http://blablabla/people.csv').call
end

csv_importer.rb

require 'csv_importer/engine'

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

  def call
    url = 'http://blablabla/people.csv'
    # I forced encoding so avoid UndefinedConversionError "\xC3" from ASCII-8BIT to UTF-8
    csv_string = open(url).read.force_encoding('UTF-8')
    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 'test_helper'
require 'rake'

class CsvImporter::Test < ActiveSupport::TestCase
  test 'truth' do
    assert_kind_of Module, CsvImporter
  end

  test 'override_application' do
    @rake = Rake::Application.new
    Rake.application = @rake
    assert_equal @rake, Rake.application
  end

  test '' do
    # something here
  end
end

Это отлично работает и заполняет мою базу данных. Как мне написать TestCase для захвата этого решения?

1 Ответ

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

Вы действительно хорошо поработали, храня всю логику своей задачи в файле библиотеки вне граблей. Я бы пошел немного дальше ...

require 'csv_importer/engine'

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

  def call
    url = 'http://blablabla/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
    ....
 end
end

Смотрите здесь, что мы убрали, как мы называем наш метод (нам все равно, вызовет ли наш метод Rake или Ruby) И, возможно, разделили, как мы получаем наши данные.

Далее я бы написал свой тест следующим образом:

test 'override_application' do
  a = WebImport.new(url: 'http://blablabla/people.csv')

  a.string_to_users("a,b,c,d,e")  # <-- a string you saved from some manual run, or that contains maybe a sample record with their exact format
  assert_equal Users.count, 42
end

Учитывая, что вы сейчас отделены:

  • как вы называете свой код, потому что он находится вне Rake в отдельной библиотеке / модуле
  • как ваш код получает данные (обычно данные предоставляются call ... но вы можете вставить сами данные здесь)

Тогда вы должны быть готовы к тестированию!

...