Làm cách nào để kiểm tra tải lên tệp trong đường dẫn?


102

Tôi có bộ điều khiển chịu trách nhiệm chấp nhận các tệp JSON và sau đó xử lý các tệp JSON để thực hiện một số bảo trì người dùng cho ứng dụng của chúng tôi. Trong quá trình người dùng thử nghiệm, quá trình tải lên và xử lý tệp hoạt động, nhưng tất nhiên tôi muốn tự động hóa quy trình kiểm tra bảo trì người dùng trong thử nghiệm của chúng tôi. Làm cách nào để tải tệp lên bộ điều khiển trong khung kiểm tra chức năng?

Câu trả lời:


110

Đã tìm kiếm câu hỏi này và không thể tìm thấy nó hoặc câu trả lời của nó trên Stack Overflow, nhưng lại tìm thấy nó ở nơi khác, vì vậy tôi yêu cầu cung cấp nó trên SO.

Khung công tác rails có một chức năng fixture_file_upload( Rails 2 Rails 3 , Rails 5 ), chức năng này sẽ tìm kiếm thư mục fixtures của bạn cho tệp được chỉ định và sẽ cung cấp nó dưới dạng tệp thử nghiệm cho bộ điều khiển trong thử nghiệm chức năng. Để dùng nó:

1) Đặt tệp của bạn sẽ được tải lên trong thử nghiệm trong thư mục con đồ đạc / tệp của bạn để thử nghiệm.

2) Trong bài kiểm tra đơn vị của bạn, bạn có thể lấy tệp thử nghiệm của mình bằng cách gọi fixture_file_upload ('path', 'mime-type').

ví dụ:

bulk_json = fixture_file_upload('files/bulk_bookmark.json','application/json')

3) gọi phương thức post để thực hiện hành động của bộ điều khiển mà bạn muốn, chuyển đối tượng được trả về bởi fixture_file_upload làm tham số tải lên.

ví dụ:

post :bookmark, :bulkfile => bulk_json

Hoặc trong Rails 5: post :bookmark, params: {bulkfile: bulk_json}

Điều này sẽ chạy qua quy trình bài đăng được mô phỏng bằng cách sử dụng bản sao Tempfile của tệp trong thư mục đồ đạc của bạn và sau đó quay lại kiểm tra đơn vị của bạn để bạn có thể bắt đầu kiểm tra kết quả của bài đăng.


2
Điều này không hoạt động trên rails 3. Có vẻ như tệp action_controller / test_process không khả dụng trong activesupport 3. Tôi đã mở một câu hỏi mới cho câu hỏi tương tự ở đây - stackoverflow.com/questions/3966263/…
Chirantan,

Liên kết trong câu trả lời của bạn là 404, hay chỉ dành cho tôi?
Ernest

@Chirantan nó đã được chuyển sang ActionDispatch :: TestProcess
ben author

làm thế nào điều này có thể được sử dụng với FactoryGirl? stackoverflow.com/questions/34677780/…
Richlewis

85

Câu trả lời của Mori là đúng, ngoại trừ việc trong Rails 3 thay vì "ActionController :: TestUploadedFile.new", bạn phải sử dụng "Rack :: Test :: UploadedFile.new".

Đối tượng tệp được tạo sau đó có thể được sử dụng làm giá trị tham số trong các bài kiểm tra Rspec hoặc TestUnit.

test "image upload" do
  test_image = path-to-fixtures-image + "/Test.jpg"
  file = Rack::Test::UploadedFile.new(test_image, "image/jpeg")
  post "/create", :user => { :avatar => file }
  # assert desired results
  post "/create", :user => { :avatar => file }     

  assert_response 201
  assert_response :success
end

Phương pháp này là một lựa chọn thay thế tuyệt vời khi đồ đạc của bạn không nằm trong / test / fixtures. Nếu bạn tạo động một số tệp cho các bài kiểm tra, chẳng hạn, chúng có thể nằm trong thư mục / tmp.
Olivier Amblet

25

Tôi nghĩ tốt hơn nên sử dụng ActionDispatch :: Http :: UploadedFile mới theo cách này:

uploaded_file = ActionDispatch::Http::UploadedFile.new({
    :tempfile => File.new(Rails.root.join("test/fixtures/files/test.jpg"))
})
assert model.valid?

Bằng cách này, bạn có thể sử dụng các phương pháp tương tự mà bạn đang sử dụng trong xác thực của mình (ví dụ: tempfile).


8

Từ Sách Rspec, B13.0:

Rails 'cung cấp một lớp ActionController :: TestUploadedFile có thể được sử dụng để đại diện cho một tệp được tải lên trong băm tham số của một thông số kỹ thuật của bộ điều khiển, như sau:

describe UsersController, "POST create" do
  after do
    # if files are stored on the file system
    # be sure to clean them up
  end

  it "should be able to upload a user's avatar image" do
    image = fixture_path + "/test_avatar.png"
    file = ActionController::TestUploadedFile.new image, "image/png"
    post :create, :user => { :avatar => file }
    User.last.avatar.original_filename.should == "test_avatar.png"
  end
end

Thông số kỹ thuật này sẽ yêu cầu bạn có hình ảnh test_avatar.png trong thư mục spec / fixtures. Nó sẽ lấy tệp đó, tải nó lên bộ điều khiển và bộ điều khiển sẽ tạo và lưu một mô hình Người dùng thực.


2
Tôi gặp lỗi "hằng số ActionController :: TestUploadedFile chưa được khởi tạo" khi tôi chạy thử nghiệm với mã này. Bất cứ điều gì khác tôi cần yêu cầu trong tệp?
Vini.g.fer

1
Nó dường như không được chấp nhận ngay từ Rails 2.3. Đối với Rails 3.0 trở đi, dưới đây là cách bạn làm điều đó bằng đồ đạc
Sebastialonso

4

Bạn muốn sử dụng fixtures_file_upload . Bạn sẽ đặt tệp thử nghiệm của mình vào một thư mục con của thư mục fixtures và sau đó chuyển đường dẫn đến fixtures_file_upload. Đây là một ví dụ về mã , sử dụng tải lên tệp cố định


1

Nếu bạn đang sử dụng thử nghiệm đường ray mặc định với factory girl. Mã dưới đây tốt.

factory :image_100_100 do
    image File.new(File.join(::Rails.root.to_s, "/test/images", "100_100.jpg"))
end

Lưu ý: bạn sẽ phải giữ một hình ảnh giả /test/images/100_100.jpg.

Nó hoạt động hoàn hảo.

Chúc mừng!


0

nếu bạn đang nhận được tệp trong bộ điều khiển của mình với những điều sau

json_file = params[:json_file]
FileUtils.mv(json_file.tempfile, File.expand_path('.')+'/tmp/newfile.json')

sau đó thử những điều sau trong thông số kỹ thuật của bạn:

json_file = mock('JsonFile')
json_file.should_receive(:tempfile).and_return("files/bulk_bookmark.json")
post 'import', :json_file => json_file
response.should be_success

Điều này sẽ làm cho phương thức giả mạo thành phương thức 'tempfile', phương thức này sẽ trả về đường dẫn đến tệp đã tải.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.