为CSV导入rake任务编写TestCase

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

暗示

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

我的Rails结构

发动机/ 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任务编写测试? 谢谢!

我没有使用引擎,但是有没有办法将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”代码分离到它们自己的类或文件中。