我有一个简单的rails应用程序,我将数据从csv导入我的rails应用程序,该应用程序正常运行,但我不知道从哪里开始测试此rake任务,以及在模块化rails应用程序中的位置即可。任何帮助,将不胜感激。谢谢!
提示
My Rails结构与传统的rails结构略有不同,因为我编写了Modular 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任务编写测试?谢谢!
答案 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”代码分离到他们自己的类或文件中。