【问题标题】:Capybara attach_file水豚 attach_file
【发布时间】:2016-01-19 05:57:40
【问题描述】:

我在我的应用程序中有一个功能测试,我在其中测试上传文件。所以我有这样的事情:

attach_file :input_id, Rails.root + "spec/fixtures/sample.jpg"
click_button "Upload"

我的“期望”总是失败,我在控制器中添加了一个 binding.pry 来检查原因。原来传递给输入文件的是一个字符串。

有人遇到过同样的问题吗?关于如何解决这个问题的任何建议?被这个问题困扰了2天了。


编辑

忘了说,输入文件是多重类型

f.attachment_field :input_field, multiple: true

【问题讨论】:

  • 您正在使用哪个库来提供#attachment_field 方法?如果重新提交 - 你碰巧使用的是直接模式还是预签名模式?

标签: ruby-on-rails testing rspec automated-tests capybara


【解决方案1】:

我在评论中问了一个问题,即#attachment_field 是否来自 refile 并且您使用的是直接模式还是预签名模式。如果您的回答是肯定的,为了节省时间:

Refile 使用直接或预签名模式时不会将文件与表单一起上传,而是使用 ajax 将文件提交到其自己的 sinatra 应用程序、S3 等(取决于所使用的后端),然后提交在添加到表单的隐藏字段中上传文件。在这种情况下,您会期望它是一个字符串。你可以阅读更多关于它的信息https://github.com/refile/refile#4-rails-helpershttps://github.com/refile/refile#5-javascript-library

【讨论】:

  • 哦,这就是为什么!谢谢!我已经坚持写测试3天了。现在,您有任何关于如何使用 capybara 的 attach_file 测试 refile 的示例吗?是否必须使用wait函数来等待refile的ajax?
  • 如果您查看 refile 项目中的 refile.js,默认情况下它会在文件输入中添加一个“上传”类,因此您可以执行 expect(page).to have_no_css('input.uploading') 之类的操作让水豚等到上传完成 - 或者如果您正在对自定义事件重新文件执行任何操作,您可以等待这些更改
  • 另外,如果您查看 refile 项目中的测试,它们使用 Capybaras attach_file,因此您应该在那里获得大量示例
【解决方案2】:

试试这个:

attach_file('Image', "spec/files/images/yourtestimg.jpg")

显然,在路径中创建这些文件夹。对不起,我宁愿过度解释也不愿解释。 yourtestimg.jpg 指的是我放在该文件夹中的实际图像。

快速附注,以上是正确的方法,但是有一次我遇到了失败,因为它无法识别“图像”。在这种情况下,右键单击并检查上传按钮的元素,然后查看该字段的名称。在失败中,我所说的字段名为“post_image”,同样,标题字段被命名为“post_caption”。一旦我将图像换成“post_image”,它就可以通过了。

贾斯汀

【讨论】:

  • 感谢您的意见。我实际上在“javascript选择”中没有遇到任何问题,或者文件存在于水豚中。但是当表单上传时,输入文件值实际上是一个字符串而不是一个对象。如果您需要示例哈希,我很乐意在此处发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
相关资源
最近更新 更多