Ruby RSpec测试使用文件:Errno::EACCES
我目前发布了一个使用rspec运行测试的问题。所有测试文件(*_spec.rb)都可以成功运行。在同样罕见的情况下,可能会出现错误--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 所有这些列表都与文件或目录一起工作,并在测试中多次使用。例如:创建
Errno::EACCES
,其中一个测试可能失败。例如:文件
*\u spec.rb
中的所有测试运行:
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”。当引发异常时,检查它们是什么。了解导致异常的文件可能会提示您引发异常的原因。如果没有,那么您必须阅读测试和应用程序代码,并查找共享此文件或修改权限的方法/进程。