RSpec测试使用以下文件:Errno::EACCES



我当前在使用rspec运行测试时遇到问题。所有测试文件(*_spec.rb)都可以成功运行。在同样罕见的情况下,可能会出现错误Errno::EACCES,其中一个测试可能失败。例如:
文件*_spec.rb中的所有测试运行:

  1. 成功
  2. 成功
  3. 有一次测试失败了
  4. 成功
  5. 一个测试失败了(与#3中的不同)
  6. 等等

异常从以下行引发:

  1. FileUtils.mv
  2. FileUtils.mkdir_p
  3. FileUtils.rm_r

所有这些列表都适用于文件或目录,并在测试中多次使用。即:
创建文件夹(包含子文件夹、文件等)、重命名文件夹、测试内容、删除。。等等

问题似乎隐藏在"定时"的某个地方(如果某个尚未完成,并且另一个操作试图访问该某些)。这种想法来自:

begin
  FileUtils.mv(a, b) # if an `Errno:EACCESS` was raised here
rescue               #
  FileUtils.mv(a, b) # it wouldn't be raised now
end

问题是
如何修复?(我的意思是很少再生的Errno:EACCESS和一些测试)


  • 在每次使用文件的操作之后添加sleep是不可接受的,不过这会有所帮助
  • ruby的方法(FileUtils.(mv|rm_r|mkdir_p))可能会被修改为在Errno::EACCES上重试一次,但这是最好的解决方案吗

p.S.
很抱歉我的英语不好,请随意提问,因为我已经尽可能简短地解释了。提前感谢,至少你已经读到最后了;

寻找根本原因,不要屈服于您提到的解决方案。

首先确保使用beforeafter来设置和拆除文件固定装置。如果您在规范中对设置和拆卸过程进行编码,那么当测试失败时,它就有无法运行的风险。

第二,确保你的设置&拆卸过程为每个测试创建不同的文件和目录。如果你所做的只是阅读,那么使用共享固定装置是可以的,但对于所有其他事情(移动、创建、附加、删除),请使用新的文件/目录。最好的做法是使用新生成的临时文件和目录。它将使您的测试独立,甚至允许并行运行它们。

第三,检查哪些其他进程可能使用测试创建/使用的文件。我不知道你的设置,这一切都取决于此,但可能的东西是网络服务器、浏览器(例如通过selenium)、邮件服务器等。只需检查你在构建中运行的其他进程。

相关内容

  • 没有找到相关文章

最新更新