Rails 迷你测试 CSV.generate

Rails MiniTest CSV.generate

在我的 Rails 6 应用程序中,我想为负责创建 CSV 文件的服务编写 MiniTest。当负责它的服务使用 CSV.open 而不是像我的 CSV.generate 时,我发现了几个例子(比如 here)。我有以下代码:

# services/csv_log_generator
class CsvLogGenerator
  LOG_HEADERS = ['Created at', 'Action Type', 'Acting User', 'New Data'].freeze

  def call
    CSV.generate(col_sep: ';', write_headers: true, headers: LOG_HEADERS, encoding: 'UTF-8') do |csv|
      PaperTrail::Version.includes([:item]).where(item_type: 'CashTransaction').limit(99).order(id: :desc).each do |v|
        tracked_data(v)
        csv << [v.created_at.in_time_zone('London'),
                v.event,
                user_name(v),
                @new_data_value]
      end
    end
  end

# csv_log_generator_test
class CsvLogGeneratorTest < ActiveSupport::TestCase
 setup do
   Book.create!(title: 'title')
   service.call
 end

test 'something that needs versioning' do
  with_versioning do
    expected_csv = File.open(file_fixture('sample.csv')).read

    assert_equal expected_csv
  end
end

我不知道如何从 service.call 中获取这个新创建的 CSV 文件,以便我可以将它与 assert_equal 中的 expected_data 进行比较。

你的服务(我假设服务 CsvLogGenerator 本身是 returns 一个字符串,所以你的测试应该是这样的(除了我省略了明显不相关的 with_versioning 包装块)

class CsvLogGeneratorTest < ActiveSupport::TestCase
  setup do
    Book.create!(title: 'title')
  end

  test 'something that needs versioning' do
    service = CsvLogGenerator.new
    actual_csv = service.call
    expected_csv = File.open(file_fixture('sample.csv')).read

    assert_equal expected_csv, actual_csv
  end
end