2014-10-17 86 views
1

我有一個Rails應用程序的後臺工作,它會生成一個大的CSV文件並將其作爲附件發送給電子郵件。爲了管理電子郵件的大小,我在壓縮CSV之前先將它壓縮。這工作正常;我們開發了開信刀,我可以打開壓縮附件並讀取數據。我使用「rubyzip」寶石來做壓縮。解壓縮二進制電子郵件附件

這個技巧似乎在測試它。使用rspec,我可以驗證消息是否有附件,並且附件的類型是application/x-zip-encoded,這是很好的。然而,我想要做的是解壓縮附件並驗證測試中的數據,這樣證明會比較困難。附件是Mail :: Part類型的對象。如果我撥打附件part,我可以使用part.body.raw_sourcepart.body.encodedpart.decode_body從中獲取數據。 (第一個和第三個是相同的。)part.body.encoding告訴我身體是二元的。當我嘗試將數據提供給Zip :: InputStream對象(使用Zip::InputStream.open(part.body.raw_source)或任何其他數據方法)時,我得到類似ArgumentError: string contains null byte的東西。

如何打開此附件並在rspec中讀取其數據?我有一個預感,那就是我需要在這裏進行一個解碼步驟。

錯誤look a lot like this question,但這裏也沒有答案。

+1

我可能會誤解,但它聽起來像你想驗證寶石是在做它應該做的。如果是這樣,你不應該這樣做。你不應該寫測試來覆蓋另一個人的圖書館。他們應該進行自己的測試,如果他們不測試,你可以爲項目提供測試,或者找到一個已經正確測試的庫。 – 2014-10-17 14:10:02

+0

它看起來像,不是。我認爲我的目標更多的是驗證附加到電子郵件的數據是應該附加的,並且解決方案是解壓縮數據並檢查它;我陷入瞭解壓縮步驟。 – pjmorse 2014-10-17 14:17:16

回答

1

這裏的解決方案有點不理想,但它的工作原理。我不得不使用郵件庫將附件寫入文件,然後使用Zip::File來提取原始數據並進行驗證。

it 'has a ZIP attachment' do 
    additional_fields = ["student_identifiers"] 

    expect(message.attachments.size).to eq(1) 
    message.attachments.first.tap do |zip| 
    expect(zip.content_type).to eq('application/x-zip-compressed') 
    tmpfile_name = "tmp/#{zip.filename}" 
    File.open(tmpfile_name, "w+b", 0644) { |f| f.write zip.decoded } 
    csv = Zip::File.open(tmpfile_name) do |zip_file| 
     entry = zip_file.glob('*.csv').first 
     entry.get_input_stream.read 
    end 
    csv.split("\n").tap do |rows| 
     expect(rows.size).to be(2) 
     rows.each do |row| 
     expect(CSV.parse_line(row).size).to eq(dimensions_count) 
     end 
    end 
    File.delete(tmpfile_name) 
    end 
end 
+0

謝謝,它可以幫助我測試它;) – piton4eg 2017-11-01 13:15:30