Rails 6中使用CSV.generate的CSV生成服务如何编写MiniTest测试用例
你的CsvLogGenerator的call方法已经直接返回了CSV.generate生成的CSV字符串,你只需要接住这个返回值就可以和预期结果对比。
具体修改步骤
- 首先调整测试代码,不要在
setup里直接执行service.call,要在测试用例内获取返回值,同时提前造好符合查询条件的测试数据(你当前查询的是item_type: 'CashTransaction'的版本,setup里创建Book是不会生成对应版本记录的) - 为了避免不同操作系统行尾符不一致导致的对比失败,可以统一把两个CSV内容的行尾符替换成
\n再对比
修改后的测试代码参考:
# csv_log_generator_test class CsvLogGeneratorTest < ActiveSupport::TestCase setup do # 提前构造符合条件的数据,触发PaperTrail生成对应Version记录 CashTransaction.create!(amount: 100, remark: "测试交易") @service = CsvLogGenerator.new end test '生成的CSV内容和预期一致' do with_versioning do # 直接获取call方法返回的CSV字符串 generated_csv = @service.call expected_csv = File.read(file_fixture('sample.csv')) # 统一行尾符避免不同操作系统的差异导致断言失败 assert_equal expected_csv.gsub("\r\n", "\n"), generated_csv.gsub("\r\n", "\n") end end end
额外注意点
- 你的
sample.csv要和生成规则完全匹配:分隔符为;、编码为UTF-8、表头和你定义的LOG_HEADERS一致,时间格式要和v.created_at.in_time_zone('London')的默认输出格式对齐 - 如果CSV包含动态生成的时间等可变内容,建议解析成CSV数组后对比行内容,避免格式差异导致的报错:
generated_rows = CSV.parse(generated_csv, col_sep: ';') expected_rows = CSV.parse(expected_csv, col_sep: ';') assert_equal expected_rows, generated_rows
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

