2014-10-17 3 views
1

큰 CSV 파일을 생성하고 이메일 메시지의 첨부 파일로 전송하는 Rails 앱에서 백그라운드 작업을하고 있습니다. 전자 메일의 크기를 관리하기 위해 첨부하기 전에 CSV를 압축하고 있습니다. 이것은 잘 작동합니다. Letter Opener가 개발 중이며 압축 된 첨부 파일을 열고 데이터를 읽을 수 있습니다. 나는 지퍼를하기 위해 "루비 지프"보석을 사용하고 있습니다.바이너리 이메일 첨부 파일의 압축을 풉니 다

트릭이이를 테스트하는 것 같습니다. rspec을 사용하여 메시지에 첨부 파일이 있고 첨부 파일 유형이 모두 application/x-zip-encoded 인 것을 확인할 수 있습니다. 제가하고 싶은 것은 첨부 파일의 압축을 풀고 테스트 내에서 데이터의 유효성을 검사하는 것입니다. 첨부 파일은 Mail :: Part 형식의 개체입니다. 첨부 파일 part을 호출하면 part.body.raw_source, part.body.encoded 또는 part.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

나는 오해가있을 수 있지만 보석이해야 할 일을하고 있는지 확인하고자하는 것 같습니다. 이 경우, 그렇게해서는 안됩니다. 다른 사람의 도서관을 다루기위한 시험을 치르면 안됩니다. 그들은 자신의 테스트를 가지고 있어야하며 그렇지 않은 경우 프로젝트에 테스트를 제공하거나 제대로 테스트 된 라이브러리를 찾을 수 있습니다. –

+0

그 것처럼 보입니다. 그렇지 않습니다. 내 목표는 이메일에 첨부 된 데이터가 첨부되어야한다고 확인하는 것이 더 중요하다고 생각합니다. 그렇게하는 방법은 데이터의 압축을 풀고 검사하는 것입니다. 압축 풀기 단계에 걸렸어. – pjmorse

답변

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

관련 문제