You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:24:02