Ruby 如何断言图像已与水豚一起上传?

Ruby 如何断言图像已与水豚一起上传?,ruby,capybara,Ruby,Capybara,假设我有一个表单,用户可以在其中创建带有图像的帖子。我想确保所附图像显示在下一页: visit url fill_in the_form click_on 'Create' assert_selector '.post' post = Post.first img = page.find '.post .image' assert_equal post.file.thumb.url, URI(img[:src]).path 但我被告知在系统测试中要避免针对数据库对象进行断言。那我该怎么办?只要

假设我有一个表单,用户可以在其中创建带有图像的帖子。我想确保所附图像显示在下一页:

visit url
fill_in the_form
click_on 'Create'
assert_selector '.post'
post = Post.first
img = page.find '.post .image'
assert_equal post.file.thumb.url, URI(img[:src]).path
但我被告知在系统测试中要避免针对数据库对象进行断言。那我该怎么办?

只要后端没有发生“复杂”的文件重命名,您在填充表单时就已经知道上载的文件名:

fill_in the_form
因此,您可以断言页面包含具有此名称的图像(可能使用
xpath


如果存在琐碎的文件重命名(例如,用连字符替换空格),则您可以(理想情况下)选择一个不会更改的文件名,或者在测试中重新进行重命名。

在填写表单时是否输入图像名称?你能不能写一个断言,说明存在一个同名的图像(或者数据库是否重命名了它)?是的,我在表单填写阶段将图像附加到表单上。然后,通常,文件名可能会在上传图像后更改。不过,那可能就行了。想把你的评论变成一个答案吗?@x-yuri这是100%正确的-而不是进行查找,然后对结果断言相等,可能应该写成
assert\u选择器('.post.image[src=“expected source”])
assert\u选择器('.post.image'){img | img[:src]=~/regex for expected path/}
或需要在过滤器块中进行的任何比较。通过这种方式,所有匹配元素的检查都发生在assert_选择器内部,该选择器将等待/重试,并防止在动态更新页面扫描时出现不稳定的测试。您详细介绍了这一点吗?你是说做
img=page.find'.post.image'不安全吗;assert_equal post.file.thumb.url,URI(img[:src]).path
?据我所知,
find
等待图像出现在页面上。之后,我可以安全地对其属性进行断言,对吗?@x-yuri假设页面上只有一个“.post.image”元素,并且一旦它出现,其属性不会更改,那么它就是安全的。但是,通过在find/assert中包含过滤,它可以处理在存在多个元素时检查特定“.post.image”元素的情况,和/或如果该元素添加到带有临时
src
属性的页面中,然后在ajax请求返回时更新为正确的属性,等等。