测试嵌套的File.open

时间:2014-01-19 21:04:06

标签: ruby

我需要测试一个文件打开操作。我可以测试first operation但不能测试second

File.open("#{TemplateFile.fixture_path}/#{@template_file}") do |input_file|
    template = ERB.new(input_file.read)
    File.open("#{@project_name}/#{@destination_file}", 'w') do |output_file|
      output_file.puts template.result binding
    end
  end
end

我正在使用此代码:

module Pod
  describe TemplateFile do
    it "opens the template" do
      dict = {"README.md.erb" => "README.md"}
      File.expects(:open).with("#{TemplateFile.fixture_path}/README.md.erb")
      File.expects(:open).with("Sample/README.md.erb", 'w')
      TemplateFile.new(dict, "Sample")
    end
  end
end

但是我收到了一个错误:

unsatisfied expectations:
  - expected exactly once, not yet invoked: File.open('/README.md.erb', 'w')
satisfied expectations:
  - expected exactly once, invoked once: File.open('/lib/pod/command/../../../fixtures/README.md.erb')

似乎摩卡不是第二个File.open

1 个答案:

答案 0 :(得分:2)

原因是因为expects验证调用是否会发生但实际上并没有让它通过。所以块中的内容无法运行。

然而,除了告诉你为什么它不起作用之外,我还想指出你在做什么可能不是你想要做的。

您可能想要做的是:

template = ERB.new(File.read("#{TemplateFile.fixture_path}/#{@template_file}"))
File.open("#{@project_name}/#{@destination_file}", 'w') do |output_file|
  output_file.puts template.result binding
end

您不需要嵌套。

然后,在测试您要执行的操作时,请确认您正确读取的文件是:

File.expects(:read).with("#{TemplateFile.fixture_path}/README.md.erb").returns(some_known_fixture)

returns部分说明当它确实使用指定的参数获取此read方法时,我希望您返回此已知事物,以便template对其余部分具有良好的值代码。