运行RSpec时遇Capybara找不到文件错误,文件存在却报错求解答
这种情况我之前也碰到过好几次,明明文件就在那儿,Capybara就是“睁眼瞎”,大概率是以下几个容易忽略的细节在搞鬼:
路径配置不匹配
先确认Capybara查找文件的根路径是不是和你存放文件的位置对应。比如你把测试用文件放在spec/support/assets下,但Capybara的file_path或asset_host配置指向了其他目录?可以在spec_helper.rb里检查相关设置:Capybara.configure do |config| # 检查本地文件查找路径 config.file_path = Rails.root.join('spec', 'support', 'assets') # 或者如果是依赖服务器的静态资源,确认asset_host是否正确 config.asset_host = 'http://localhost:3000' end另外用
page.attach_file这类方法时,要注意传的是相对Capybara根路径的路径,别和项目根路径搞混了。文件名大小写敏感
如果是在Linux或开启了大小写敏感的macOS APFS分区上运行,文件名的大小写必须完全匹配。比如代码里写的是test_report.pdf,实际文件是Test_Report.pdf,系统会判定为两个不同文件,Capybara自然找不到。文件权限不足
别忽略权限问题!就算文件存在,当前运行RSpec的用户可能没有读取权限。在终端用ls -l 你的文件名查看权限,确保用户有读权限(比如权限显示为-rw-r--r--)。如果权限不够,执行chmod +r 你的文件名添加读权限。缓存或预编译残留
要是你用的是Rails项目,资产预编译缓存可能拖后腿。刚添加的文件没触发预编译,或者旧缓存没清?试试运行rails assets:precompile(开发环境可跳过,但缓存残留时有用),或者重启测试服务器、清空测试环境缓存。等待时间不够
如果文件是动态生成的(比如测试过程中生成的临时文件),Capybara可能在文件完全生成前就去查找了。可以调整默认等待时间给点缓冲:Capybara.default_max_wait_time = 10文件实际位置和你以为的不一样
别太相信IDE的目录显示!用终端命令确认文件绝对路径:find /你的项目根路径 -name "目标文件名",看看实际找到的路径和你代码里写的是否一致。有时候符号链接、IDE的虚拟目录会误导你。
内容的提问来源于stack exchange,提问作者ipnicholson

