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

时间:2012-08-29 09:38:39

标签: ruby rspec ruby-1.9.2

我目前发布了使用rspec运行测试的问题。所有测试文件(* _spec.rb)都可以成功运行。在极少数情况下,可能会出现错误 - Errno::EACCES,其中一个测试可能会失败。 E.g:
文件*_spec.rb中的所有测试都运行:

  1. 成功。
  2. 成功。
  3. 其中一项测试失败了。
  4. 成功。
  5. 一个测试失败了(与#3不同)。
  6. 异常来自如下行:

    1. FileUtils.mv
    2. FileUtils.mkdir_p
    3. FileUtils.rm_r
    4. 所有这些列表都与文件或目录一起使用,并且在测试中多次使用。即:。创建文件夹(包含子文件夹,包含文件等),重命名文件夹,测试内容,删除..等等。

      看起来问题隐藏在“计时”的某个地方(如果某些尚未完成,而另一个操作试图访问某些)。这个想法来自:

      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。
      对不起我的英语,随时可以提出任何问题,因为我试图尽可能简短地解释。先谢谢你,至少你已经把它读到最后了;

1 个答案:

答案 0 :(得分:0)

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

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

其次,请确保您的设置&拆卸程序为每个测试创建不同的文件和目录。如果你所做的只是阅读它可以使用共享的灯具,但对于所有其他的东西(移动,创建,追加,删除)使用一个新的文件/目录。最好的办法是使用新生成的临时文件和目录。它将使您的测试独立,甚至允许并行运行它们。

第三,检查其他进程可能使用测试创建/使用的文件。我不知道你的设置,这完全取决于它,但可能的东西是网络服务器,浏览器(例如通过selenium),邮件服务器等。只需检查你正在运行的其他进程作为构建的一部分。< / p>