为CSV导入rake任务编写TestCase

时间:2018-05-04 18:58:11

标签: ruby-on-rails ruby

我有一个简单的rails应用程序,我将数据从csv导入我的rails应用程序,该应用程序正常运行,但我不知道从哪里开始测试此rake任务,以及在模块化rails应用程序中的位置即可。任何帮助,将不胜感激。谢谢!

提示

  

My Rails结构与传统的rails结构略有不同,因为我编写了Modular Rails应用程序。我的结构如下图所示:

My Rails Structure

引擎/ csv_importer / LIB /任务/ web_import.rake

从csv ..

导入的rake任务
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

要在应用程序的根目录中正确迁移,我添加了初始化程序

/engines/csv_importer/lib/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 app。我解释了这一点,所以任何有帮助的人都会明白在编写引擎内部rake任务的测试时如何帮助我。

我在编写TEST方面所做的工作

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

有人如何在模块化应用程序中为rake任务编写测试?谢谢!

1 个答案:

答案 0 :(得分:3)

我没有使用引擎,但是有没有办法将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任务和作业(Sidekiq等)时,您希望使Rake任务尽可能地围绕代码的实际内容(在本例中为CSV解析)进行操作。将“触发csv解析”代码从“实际解析csv”代码分离到他们自己的类或文件中。