【问题标题】:RSpec testing work with files: Errno::EACCESRSpec 测试使用文件:Errno::EACCES
【发布时间】:2012-08-29 09:38:38
【问题描述】:

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

  1. 成功。
  2. 成功。
  3. 一个测试失败了。
  4. 成功。
  5. 一个测试失败(与 #3 不同)。

异常从以下行引发:

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

所有这些列表都适用于文件或目录,并在测试中多次使用。即:
创建文件夹(带有子文件夹,带有文件等),重命名文件夹,测试某些东西,删除..等等。

看起来问题隐藏在“时间”中的某处(如果 something 尚未完成并且另一个操作试图访问该something)。这个想法来自:

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 上重试一次,但这是最好的解决方案吗?

附言
对不起我的英语,请随时提出任何问题,因为我试图尽可能简短地解释。在此先感谢您,至少您已经读到了最后;

【问题讨论】:

    标签: ruby rspec ruby-1.9.2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • create different files and directories for each test -- 你的意思是如果我有 100 个测试 [(before test)mkdir_p(a), testing, (after test)rm_r(a)] a 不应该是一个常数喜欢:a = 'temp/something'?
    • 在每次测试之前都会创建一个新文件夹,之后会删除它。没有一个进程使用测试的“输出数据”。
    • 是的,最好使用随机的临时名称,请参阅 apidock.com/ruby/Tempfile 这样您就可以并行运行测试,并且一个测试影响另一个测试的可能性较小。
    • 如果您收到Errno:EACCESS 异常,请注意引发的文件。追踪问题的根源并尝试调试它。如果没有更多细节(例如负责的代码),我无法为您提供更多帮助。
    • 好的,您在代码中找到了引发异常的位置,但您还需要值,在本例中为“src”和“dest”。引发异常时检查它们是什么。了解导致异常的文件可能会提示您引发异常的原因。如果没有,那么您必须阅读您的测试和应用程序代码并查找共享此文件或修改权限的方法/进程。
    猜你喜欢
    • 2017-12-09
    • 2011-11-07
    • 2020-09-19
    • 1970-01-01
    • 2020-11-09
    • 2013-07-04
    • 2014-09-17
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多