【问题标题】:Rspec test rails generate CSVRspec 测试轨生成 CSV
【发布时间】:2019-09-17 08:54:12
【问题描述】:

我有一个简单的 CSV rails 生成器,我不知道如何使用 rspec 对其进行测试。我试图关注这篇文章 https://making.dia.com/testing-csv-files-in-rails-on-the-fly-7a1285cc2aac 和那篇文章 Testing CSV.generate with RSpec 但我只是不明白那里发生了什么,这些例子似乎有所不同。

module AdminLogData
  class CsvAdminLogGenerator
    LOG_HEADERS = ['Date&Time', 'Action', 'New Data'].freeze

    def initialize(start_date:, end_date:)
      @start_date = start_date
      @end_date = end_date
    end

    def call
      AdminPanelLog.dates_between(start_date, end_date).find_each do |admin_log|
        CSV.generate(headers: LOG_HEADERS, col_sep: ';', encoding: 'UTF-8') do |csv|
          csv << admin_log.created_at
          csv << admin_log.action_type
          csv << admin_log.admin_email
          csv << admin_log.new_data
        end
      end
    end
  end
end

谁能解释我如何测试这个类?我应该先创建一些假的 csv 吗?

spec

RSpec.describe AdminLogData::CsvAdminLogGenerator do
  subject(:csv_file) { described_class.new(start_date, end_date).call }

  let(:start_date) { 3.months.ago }
  let(:end_date) { 2.months.ago }

  let(:header) { 'column1, column2, column3' }
  let(:row2) { 'value1, value2, value3' }
  let(:row3) { 'value1, value2, value3' }
  let(:rows) { [header, row2, row3] }

  it 'creates CSV file with proper value' do
    expect(csv).to receive(:<<).with(log.created_at)
  end
end

编辑:

   expected collection contained:  ["2019-06-17 22:13:48 +0200,New,monte@kuphal.biz,\"{\"\"email\"\"=>\"\"jeanna@schinner.io\"\", \"\"ro...=>\"\"2019-09-16T22:13:48.752+02:00\"\", \"\"other_activities\"\"=>\"\"forbidden websites\"\"}\"\n"]
   actual collection contained:    ["2019-06-17 22:13:48 +0200", "New", "monte@kuphal.biz", "{\"email\"=>\"brandon@williamsonsporer.org\... \"last_update\"=>\"2019-09-16T22:13:48.752+02:00\", \"other_activities\"=>\"forbidden websites\"}"]
   the missing elements were:      ["2019-06-17 22:13:48 +0200,New,monte@kuphal.biz,\"{\"\"email\"\"=>\"\"jeanna@schinner.io\"\", \"\"ro...=>\"\"2019-09-16T22:13:48.752+02:00\"\", \"\"other_activities\"\"=>\"\"forbidden websites\"\"}\"\n"]
   the extra elements were:        ["2019-06-17 22:13:48 +0200", "New", "monte@kuphal.biz", "{\"email\"=>\"brandon@williamsonsporer.org\... \"last_update\"=>\"2019-09-16T22:13:48.752+02:00\", \"other_activities\"=>\"forbidden websites\"}"]

【问题讨论】:

    标签: ruby-on-rails csv rspec


    【解决方案1】:

    第 1 步:为 AdminLogData 创建工厂

    将 gem factory_botfaker 结合使用,您将能够为您的测试生成假的 AdminLogData 对象。

    第 2 步:编写测试

    在您的测试中,您更可能想要测试 CSV 行是否包含正确的数据,而不是类接收“

    RSpec.describe AdminLogData::CsvAdminLogGenerator do
      subject(:csv_file) { described_class.new(start_date, end_date).call }
    
      let(:start_date) { 3.months.ago }
      let(:end_date) { 2.months.ago }
    
      let(:admin_log_data) { FactoryBot.create(:admin_log_data, created_at: 3.months.ago) }
    
      before { admin_log_data }
    
      it 'creates CSV file with proper value' do
        expect(csv_file.to_a[1]).to match_array(CSV.generate_line([
          admin_log_data.created_at
          admin_log_data.action_type
          admin_log_data.admin_email
          admin_log_data.new_data      
        ]))
      end
    end
    

    【讨论】:

    • 感谢您的回复!请看一下我编辑的问题。我在您实施后提出了一个错误。在it 之后,我必须添加两行csv_filecsv = CSV.open('app/custom/file.csv')
    • 看起来是因为预期的集合没有用分隔符分割,而是返回一个完整的数组。尝试在 CSV.generate_line() 部分后添加.split(',')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2014-01-05
    • 2017-02-27
    相关资源
    最近更新 更多