Ruby RSpec测试使用文件:Errno::EACCES

Ruby RSpec测试使用文件:Errno::EACCES,ruby,rspec,ruby-1.9.2,Ruby,Rspec,Ruby 1.9.2,我目前发布了一个使用rspec运行测试的问题。所有测试文件(*_spec.rb)都可以成功运行。在同样罕见的情况下,可能会出现错误--Errno::EACCES,其中一个测试可能失败。例如: 文件*\u spec.rb中的所有测试运行: 成功 成功 有一次测试失败了 成功 其中一项测试失败(与第3项不同) 等等 从以下行引发异常: FileUtils.mv FileUtils.mkdir\u p FileUtils.rm\u r 所有这些列表都与文件或目录一起工作,并在测试中多次使用。例如:创建

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

  • 成功
  • 成功
  • 有一次测试失败了
  • 成功
  • 其中一项测试失败(与第3项不同)
  • 等等
  • 从以下行引发异常:

  • FileUtils.mv
  • FileUtils.mkdir\u p
  • FileUtils.rm\u 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
    很少被复制,有些测试也很少被复制)


    • 在每次文件操作后添加
      睡眠
      是不可接受的,但会有所帮助
    • ruby的方法(
      FileUtils.(mv | rm|r | mkdir|p)
      )可以修改为在
      Errno::EACCES上重试一次,但这是最好的解决方案吗
    附加说明

    对不起,我的英语不好,请随意提问,因为我已经尽可能简短地解释了。提前感谢,至少你已经把这篇文章读到了最后

    寻找根本原因,不要屈服于你提到的变通办法

    首先确保您正在使用
    之前
    之后
    来设置和拆除文件固定装置。如果在规范本身中编写安装和拆卸过程的代码,则在测试失败时,可能无法运行

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


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

    为每个测试创建不同的文件和目录
    ——您的意思是如果我有100个测试[(测试前)mkdir\u p(a),测试,(测试后)rm_r(a)]
    a
    不应该是一个常数,比如:
    a='temp/something'
    ?在每次测试之前创建一个新文件夹,然后删除它。没有一个进程使用测试的“输出数据”。是的,最好使用随机临时名称,这样您可以并行运行测试,并且一个测试影响另一个测试的可能性较小。如果您得到
    Errno:EACCESS
    异常,请注意引发该异常的文件。跟踪问题的根源并尝试调试它。如果没有更多的细节(比如代码中负责的部分),我无法进一步帮助您。好的,您在代码中得到了引发异常的位置,但是您还需要值,在本例中为“src”和“dest”。当引发异常时,检查它们是什么。了解导致异常的文件可能会提示您引发异常的原因。如果没有,那么您必须阅读测试和应用程序代码,并查找共享此文件或修改权限的方法/进程。