Написание TestCase для CSV импорта грабли задачи - PullRequest
0 голосов
/ 04 мая 2018

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

Подсказка

Моя структура Rails немного отличается от традиционных структур rails, так как я написал приложение Modular Rails. Моя структура на картинке ниже:

My Rails Structure

Двигатели / csv_importer / Библиотека / Задачи / web_import.rake

Задание rake, импортируемое из csv ..

require 'open-uri'
require 'csv'

namespace :web_import do
  desc 'Import users from csv'

  task users: :environment do
    url = 'http://blablabla.com/content/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 в моей родительской структуре

Это делает движок csv_importer доступным в корне приложения.

Rails.application.routes.draw do
  mount CsvImporter::Engine => '/', as: 'csv_importer'
end

Для корректной миграции в корень приложения я добавил инициализатор

/ Двигатели / csv_importer / Библиотека / csv_importer / engine.rb

module CsvImporter
  class Engine < ::Rails::Engine
    isolate_namespace CsvImporter

    # This enables me to be able to correctly migrate the database from the parent application.
    initializer :append_migrations do |app|
      unless app.root.to_s.match(root.to_s)
        config.paths['db/migrate'].expanded.each do |p|
          app.config.paths['db/migrate'] << p
        end
      end
    end
  end
end

Так что с этим объяснением я могу запускать приложение rails, как и любое другое приложение rails. Я объяснил это, так что любой, кто поможет, поймет, с чем мне помочь в отношении написания теста для граблей в двигателе.

Что я сделал в отношении написания ТЕСТА

task import: [:environment] do
  desc 'Import CSV file'
  task test: :environment do
    # CSV.import 'people.csv'
    Rake::Task['app:test:db'].invoke
  end
end

Как кто-то может написать тест для граблей в модульном приложении? Спасибо!

1 Ответ

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

Я не работал с движками, но есть ли способ просто поместить логику импорта CSV в свой собственный класс?

namespace :web_import do
  desc 'Import users from csv'

  task users: :environment do
    WebImport.new(url: 'http://blablabla.com/content/people.csv').call
  end
end

class WebImport # (or whatever name you want)
  def initialize(url) ... end

  def call
    counter, CSV parse, etc...
  end
end

Таким образом, вы можете врезаться в консоль Rails, чтобы выполнить WebImport, и вы также можете выполнить тестовую изоляцию WebImport. Когда вы выполняете задачи Rake и Jobs (Sidekiq и т. Д.), Вы хотите, чтобы задача Rake действовала как можно более тонкой оберткой вокруг фактического содержимого кода (который в данном случае разбирается в CSV). Отделите код «триггер анализа CSV» от кода «фактически анализируйте CSV» на их собственные классы или файлы.

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