2012-01-25 34 views
16

Dưới đây là mã thử nghiệm của tôi để tải lên tệp.fixture_file_upload có {file} không tồn tại lỗi

describe "file process" do 
before(:each) do 
    # debugger 
    @file = fixture_file_upload('test.csv', 'text/csv') 
end 

it "should be able to upload file" do 
    post :upload_csv, :upload => @file 
    response.should be_success 
end 
end 

Tuy nhiên, khi tôi chạy rspec đặc tả, nó tạo ra cho tôi những lỗi dưới đây

Failure/Error: @file = fixture_file_upload('test.csv', 'text/csv') 
RuntimeError: 
    test.csv file does not exist 
# ./spec/controllers/quotation_controller_spec.rb:29:in `block (3 levels) in <top (required)>' 

Tôi có googled rất nhiều nơi nhưng tôi vẫn không thể tìm ra lý do đằng sau đó là những gì. Bất kỳ ý tưởng?

+7

Tìm thấy một giải pháp từ SO [http://stackoverflow.com/questions/3966263/attachment-fu-testing-in-rails-3](http:// stackoverflow.com/questions/3966263/attachment-fu-testing-in-rails-3). Rõ ràng, tôi phải thay thế fixture_file_upload bằng dòng này '@file = Rack :: Test :: UploadedFile.new (Rails.root.join ('spec/fixtures/test.csv'), 'text/csv')' – hanchee

+0

fixture_file_upload không làm việc với Rails 3.1? – hanchee

+1

Tôi bắt đầu thấy điều này sau khi chúng tôi nâng cấp lên 3.2 – plainjimbo

Trả lời

0

Dựa trên câu trả lời đã bỏ phiếu nhất trên this câu hỏi, bạn cần phải đặt các tập tin dưới {} Rails.root/spec/fixtures/file

26

Fixture_file_upload về cơ bản vẫn hoạt động. Bạn chỉ cần để đảm bảo đồ đạc đường dẫn trong tập tin spec_helper.rb của bạn là không chú thích & đúng thiết lập để spec/fixtures đường & bao gồm ActionDispath::TestProcess:

RSpec.configure do |config| 
    config.include ActionDispatch::TestProcess 

    # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    ... 

Và nơi mà bạn đang xác định các tập tin trong các thử nghiệm của bạn, hãy chắc chắn trước của bạn nộp tên bằng '/' như ví dụ sau:

describe "POST /subscriber_imports" do 
    let(:file) { { :file => fixture_file_upload('/files/data.csv', 'text/csv') } } 
    subject { post :create, :subscriber_import => file } 
    ... 
end 

đường dẫn tuyệt đối đến tập tin là con đường cơ sở quy định tại config.fixture_path cộng với đường dẫn tương đối quy định tại fixture_file_upload gọi hàm. Vì vậy, trong ví dụ này, file.csv phải được đặt trong #{::Rails.root}/spec/fixtures/files/data.csv

+3

Cũng lưu ý 'include ActionDispatch: : TestProcess'. Điều này đặc biệt cố định vấn đề cho tôi – FeifanZ

+0

'bao gồm ActionDispatch :: TestProcess' là những gì cố định nó cho tôi là tốt. Phần lẻ là chúng tôi đã sử dụng tiền phạt 'fixture_file_upload' trong các thử nghiệm rspec khác, nhưng nó không thành công cho một thử nghiệm mới. Có thể đã được rằng spec mới này đã được scoped trong một mô-đun. – nrowegt

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