0

我目前在使用 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但这是最好的解决方案吗?

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

4

1 回答 1

0

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

首先确保您使用beforeandafter来设置和拆除文件固定装置。如果您在规范本身中编写设置和拆卸过程,则在测试失败时您将面临无法运行的风险。

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

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

于 2012-08-29T10:23:52.297 回答