2011-10-31 32 views
6

Tôi đang sử dụng khối mã này để bắt chước cách thức tập tin được tải lên:RSpec chuyển đổi các tham số POST thành chuỗi? (Kiểm tra tập tin tải lên)

def mock_file 
    file = File.new((Rails.root + "public/checklist_items_template.csv"),"r") 
    image = ActionDispatch::Http::UploadedFile.new(
      :filename => "checklist_items_template.csv", 
      :type => "text/csv", 
      :head => "Content-Disposition: form-data; 
        name=\"checklist_items_template.csv\"; 
        filename=\"checklist_items_template.csv\" 
        Content-Type: text/csv\r\n", 
      :tempfile => file) 
    return image 
end 

Trong thử nghiệm rspec nó được POST'd với bộ điều khiển:

post :create, :legal_register_id => "1", :register => {"file" => mock_file} 

Nhưng nó phá vỡ dòng này trong bộ điều khiển thực tế:

CSV.parse(params[:register][:file].read.force_encoding('UTF-8')) 

Vì params [: register] [: file] được hiểu là chuỗi thay vì đối tượng actiondispatch:

undefined method `read' for "#<ActionDispatch::Http::UploadedFile:0x00000108de3da8>":String 

Hành vi chuẩn này có dành cho rspec không? Có cách nào để vượt qua các đối tượng thông qua params?

+0

vì vậy ... bạn có làm cho nó hoạt động không? Câu trả lời của tôi có giúp ích không? –

Trả lời

2

Không phải RSpec chuyển đổi các đối tượng param của bạn thành chuỗi, đó là Rails 3.1.

Bạn có thể sử dụng nó bằng cách sử dụng fixture_file_upload như được mô tả trong this answer.

0

Bạn có thể cần phải sử dụng này: ActionController :: TestUploadedFile thay vì một tập tin ActionDispatch thực tế

Xem S/O câu hỏi này khác cho một ví dụ về sử dụng: How do I test a file upload in rails?

Mặc dù một điều này cho thấy bạn thể sử dụng những gì bạn đã có: test a file upload using rspec - rails

Cũng xem xét nó có thể là một cái gì đó tinh ranh với rspec không điều trị: đăng ký => {: file => blah} thứ e giống như: register => {'file' => blah}

Các vấn đề liên quan