【问题标题】:How to mock or stub chmod method under FileUtils class in ruby如何在 ruby​​ 中的 FileUtils 类下模拟或存根 chmod 方法
【发布时间】:2016-10-05 05:53:44
【问题描述】:

大家好,我真的需要关于如何在 ruby​​ 中的 FileUtils 类下存根或模拟 chmod 方法的帮助。

目前我有这个代码。

def create_file(file)
    unless File.exist?(file)
        FileUtils.mkdir_p(File.dirname(file), :mode => 0755)
        FileUtils.touch file
        FileUtils.chmod(0644, file)
    end
end

file 位于 /usr/local/something_folder/filePath.fileExtension

下的位置

这是我为上面的代码创建的等效测试代码。

File.stub(:dirname).and_return('fileFullPath')
FileUtils.stub(:mkdir_p).and_return('fileFullPath')
FileUtils.stub(:touch).and_return('fileFullPath')
FileUtils.stub(:chmod).and_return('fileFullPath')

这里的问题是 /usr/local 文件路径下的权限,这就是我要存根或模拟该方法调用的原因。

如果你能帮我解决这个问题,我会很高兴和感激。

编码快乐的家伙 :)

【问题讨论】:

标签: ruby rspec fileutils


【解决方案1】:

你必须考虑的一个模拟规则是“只模拟你拥有的东西”。您不拥有的文件和 FileUtils。如果你真的想这样做,你可以试试 gem fakefs。我会推荐另一种方法:

class YourClass
   attr_accessor :file_class, :file_utils_class

   def file_class
      @file_class ||= File
   end

   def file_utils_class
     @file_utils_class ||= FileUtils
   end

   def create_file(file)
     unless file_class.exist?(file)
       file_utils_class.mkdir_p(file_class.dirname(file), :mode => 0755)
       file_utils_class.touch file
       file_utils_class.chmod(0644, file)
     end
   end
 end

这样你就可以在测试期间注入一个你想要的对象。

【讨论】:

  • “嘲笑你拥有的东西”并不总是可行的。为什么我应该让供应商库(或标准库)为此做一个漫长的过程,而不是仅仅模拟它的返回值以获得更快的规范结果?
  • 您的代码应该在测试中至少调用一次此方法,否则您将看不到此方法何时改变其行为。此外,您可以重新考虑您的设计并将您的代码与此类供应商库分离。当您直接模拟此方法时,您会想到很多假设。
猜你喜欢
  • 2021-02-09
  • 2010-11-03
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多