Rspec 测试表单文件上传

Mar*_*ang 4 rspec capybara ruby-on-rails-4

我正在尝试使用 AWS S3 为文件上传编写集成测试。我试图测试的行为是用户应该点击“选择文件”按钮,然后选择一个视频,然后用户应该看到视频并且视频计数应该增加 1。我'我在这里的起点绊倒了,甚至似乎不能让用户点击按钮。我正在使用s3 直接上传 gem,我用于表单的 javascript 是

<script id="template-upload" type="text/x-tmpl">
Run Code Online (Sandbox Code Playgroud)

我的输出 HTML 看起来像这样

<form accept-charset="UTF-8" action="https://bucketname-bucket.s3.amazonaws.com/" data-callback-method="POST" data-callback-param="video[direct_upload_url]" data-callback-url="http://0.0.0.0:3000/videos" enctype="multipart/form-data" id="s3-uploader" method="post">
***some AWS stuff***
<input id="file" multiple="multiple" name="file" type="file">
Run Code Online (Sandbox Code Playgroud)

因此,如果您确实转到该页面,则会有一个显示“选择文件”的按钮。如果我点击它,它会让我选择一个文件上传。但是,当我放入 rspec

click_button "Choose Files"
Run Code Online (Sandbox Code Playgroud)

它说它找不到按钮。所以显而易见的问题是,我如何让它假装点击按钮?

Ant*_*ony 6

您并没有真正提供有关您在 Ruby 中的表单以及表单生成的 HTML 或您编写的测试的任何信息,因此我将仅举一个示例。

  let(:user) { FactoryGirl.create(:user) }
  let!(:project) { FactoryGirl.create(:project) }
  before(:each) do
    sign_in_as(user)
  end

  scenario 'a registered user logins and creates a new music project' do
    count = Project.all.count
    visit new_project_path

    fill_in 'Title', with: "Chillwave Song"
    fill_in 'Description', with: "I started this after being inspired by a Tycho concert"
    attach_file('project[project_file]', File.join(Rails.root, '/spec/support/project.zip'))

    click_button('Submit')

    expect(page).to have_content('Project created successfully!')
    expect(page).to have_content('I started this after being inspired by a Tycho concert')
    expect(Project.all.count).to eq(count + 1)
  end
Run Code Online (Sandbox Code Playgroud)

所以这里应该有一些东西会跳到你身上 - 你真的想在每次运行测试时上传一个文件吗?答案应该是否定的,那么你如何“伪造”这个上传过程?最好的建议是在你的工厂中使用它:

FactoryGirl.define do
  factory :attachment do
    file ActionDispatch::Http::UploadedFile.new(:tempfile => File.new("#{Rails.root}/spec/support/project.zip"), :filename => "project.zip")
  end
end
Run Code Online (Sandbox Code Playgroud)