如何在rails 4.2.1中模拟文件以测试文件上传



我正在测试从CSV导入产品的操作。

我能通过第一次考试。params[:file]作为字符串"#<StringIO:0x007fc0d40a0bd0>"进入控制器,这不会使我的测试失败,但它不是正确的行为。

第二个测试我得到以下错误

private method `gets' called for  #<ActionDispatch::Http::UploadedFile:0x007fd391de0a00>

这是我的规格(内容是CSV内容)

  # spec/controllers/products_controller_spec.rb
  describe 'POST import with file' do
    before do
      post :import, file: file
    end
    context 'with invalid data' do
      subject { Spree::Product.count }
      let(:file) { StringIO.new("") }
      it { is_expected.to eq 0 }
    end
    context 'with valid data' do
      subject { Spree::Product.count }
      let(:file) { ActionDispatch::Http::UploadedFile.new(params) }
      let(:params) do
        {
          original_filename: 'file.csv',
          content_type: 'text/csv',
          tempfile: StringIO.new(content)
        }
      end
      it { is_expected.to eq 1 }
    end
  end

试着用Rack::Test::UploadedFile上传一个测试文件,就像这样

context 'with valid data' do
  subject { Spree::Product.count }
  let(:path_to_file) { Rails.root.join 'spec/fixtures/file.csv' }
  let(:file) { Rack::Test::UploadedFile.new path_to_file, 'text/csv' }
  it { is_expected.to eq 1 }
end

最新更新