5

我有一个关于如何使用 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

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

file =  <<EOF
A_NAME: ABC
A_ALIAS: my_alias
EOF
4

2 回答 2

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)

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

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

YAML.should_receive(:load_file).with(filepath).and_return(yaml)
于 2013-01-23T21:48:49.143 回答
2

如果这个想法是对某事寄予期望,我认为这种调用YAML.load伪造回报的方法没有多大好处。YAML.load_file实际上返回一个哈希,所以我的建议不是做所有的事情,而是简单地返回一个哈希:

parsed_yaml = { 
  "somekey" => {
    "someotherkey" => "abc"
  } 
}

YAML.should_receive(:load_file).with(filepath).and_return(parsed_yaml)

由于这应该是一个单元测试而不是一个集成测试,我认为这会更有意义。

于 2013-09-19T17:18:34.147 回答