模拟文件输入作为 Rspec 上的文件路径

xbe*_*eta 5 ruby testing rspec mocking sinatra

我有一个关于如何使用 rspec 模拟文件输入的问题。我有以下课程代码,但不完全知道为什么要模拟文件输入。filepath/path/to/the/file

我在谷歌上进行了搜索,结果通常是加载实际文件而不是模拟,但实际上我正在寻找相反的情况,只模拟而不使用实际文件。

module Service
  class Signing
    def initialize(filepath)
      @config = YAML.load_file(filepath)
      raise "Missing config file." if @config.nil?
    end

    def sign()      …
    end

    private
    def which()     …
    end

  end 
end
Run Code Online (Sandbox Code Playgroud)

是否可以为此文件输入模拟使用 EOF 分隔符?

file =  <<EOF
A_NAME: ABC
A_ALIAS: my_alias
EOF
Run Code Online (Sandbox Code Playgroud)

Jim*_*art 4

YAML.load_file您可以从文本中删除并返回解析后的 YAML,如下所示:

yaml_text = <<-EOF
  A_NAME: ABC
  A_ALIAS: my_alias
EOF
yaml = YAML.load(yaml_text)
filepath = "bogus_filename.yml"
YAML.stub(:load_file).with(filepath).and_return(yaml)
Run Code Online (Sandbox Code Playgroud)

这并没有完全消除文件加载本身,但要做到这一点,您必须对 YAML.load_file 在幕后的作用做出假设,这不是一个好主意。由于可以安全地假设 YAML 实现已经过测试,因此您可以使用上面的代码将整个调用替换为从文本解析的固定装置。

如果您想测试是否将正确的文件名传递给load_file,请将存根替换为期望值:

YAML.should_receive(:load_file).with(filepath).and_return(yaml)
Run Code Online (Sandbox Code Playgroud)