在 Capybara 中测试 JQuery 上传:文件未附加

Posted

技术标签:

【中文标题】在 Capybara 中测试 JQuery 上传:文件未附加【英文标题】:Testing JQuery Upload in Capybara: Files are not attaching 【发布时间】:2017-07-15 15:03:36 【问题描述】:

我目前正在构建一个使用 jquery-upload 插件的 Rails 应用程序,以允许用户上传文件以执行诸如设置用户头像之类的操作。如果上传成功,它会在表单上设置一个带有上传ID的隐藏字段,并在提交表单时保存关联。当我手动测试它时,它会按照预期的方式工作。但是,我无法让我的 RSpec 测试通过。

我使用 RSpec 作为我的测试框架和 Capybara-webkit 作为我的 javascript 驱动器。文件应该附加的字段如下所示

= file_field_tag :file, class: "upload_file_field" (另外,使用 slim 进行模板)

处理文件上传的coffeescript如下所示

$element.fileupload
  dropZone: $dropzoneElement
  url: "/uploads.json"
  method: "PATCH"
  fail: (e, data) =>
    @showErrorOnFailure(e, data)
  done: (e, data) =>
    @onSuccessfulUpload(e, data)

处理文件上传的控制器代码如下所示

class UploadsController < ApplicationController
  def create
    @upload = Upload.new(file: params[:file])

    byebug

    if @upload.save
      respond_to do |format|
        format.json  render json: upload: @upload, url: @upload.file.url(:avatar)  
      end
    else
      respond_to do |format|
        format.json  render json: , status: :unprocessable_entity 
      end
    end
  end
end

这是我在测试中用来附加文件的 RSpec 代码

filepath = "#Rails.root/spec/support/fixtures/uploads/flickr.jpg"
attach_file :file, filepath

click_on "Submit"

expect(page).to have_css(".avatar-img img")

当我运行测试时,整个请求都会通过(Capybara 并未表示它在查找文件或表单域时遇到了问题)。但是,测试失败。当我使用 byebug 检查上传控制器时它收到保存新上传的请求时,没有发送任何参数。正如params[:file] 的计算结果为nil,它应该具有flickr.jpg 的文件信息。知道为什么我的文件没有在测试中附加,即使 Capybara 没有提出任何错误。

【问题讨论】:

【参考方案1】:

所以看完这篇文章我找到了答案:

Capybara webkit doesn't pass params from angular

问题似乎来自我使用 PATCH 发送上传的事实。将方法更改为 PUT 后,我的测试开始通过。

【讨论】:

以上是关于在 Capybara 中测试 JQuery 上传:文件未附加的主要内容,如果未能解决你的问题,请参考以下文章

在 Cucumber + Capybara + PhantomJS 在 Rails 中调试 jQuery Ajax

如何在测试之间重复使用 Capybara 会话?

在 Rails 中使用 Capybara 和 Selenium 测试 Google 地图标记

如何使用rails cucumber,rspec,capybara在视图(dhtml)中测试动态部分?

Capybara:测试何时禁用 cookie、localStorage 和 sessionStorage

在 Rails 中,我应该在 capybara(或集成)测试中包含用户输入表单错误流吗?