为 rake 任务编写单元测试
writing unit test for a rake task
我有一个简单的 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 来捕获此解决方案?
您实际上已经做好了将所有任务逻辑保存在 rake 之外的库文件中的事情。我会在这里更进一步...
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
鉴于你们现在已经分居:
- 你如何调用你的代码,因为它在单独的 library/module
中远离 Rake
- 您的代码如何获取数据(通常由
call
提供数据...但您可以在此处自行插入数据)
那么您应该已经准备好开始您的测试驱动设计了!
我有一个简单的 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 来捕获此解决方案?
您实际上已经做好了将所有任务逻辑保存在 rake 之外的库文件中的事情。我会在这里更进一步...
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
鉴于你们现在已经分居:
- 你如何调用你的代码,因为它在单独的 library/module 中远离 Rake
- 您的代码如何获取数据(通常由
call
提供数据...但您可以在此处自行插入数据)
那么您应该已经准备好开始您的测试驱动设计了!