ruby - Rspec:如何测试文件操作和文件内容




file testing (4)

你可以使用fakefs

它存根文件系统并在内存中创建文件

你检查一下

File.exists? "filename" 

如果文件已创建。

您也可以阅读它

File.open 

并对其内容运行期望。

在我的应用程序中我有这样的代码:

File.open "filename", "w" do |file|
  file.write("text")
end

我想通过rspec测试这段代码。 这样做的最佳做法是什么?


对于像我这样需要修改多个目录中的多个文件的人(例如生成器用于Rails),我使用临时文件夹。

Dir.mktmpdir do |dir|
  Dir.chdir(dir) do
    # Generate a clean Rails folder
    Rails::Generators::AppGenerator.start ['foo', '--skip-bundle']
    File.open(File.join(dir, 'foo.txt'), 'w') {|f| f.write("write your stuff here") }
    expect(File.exist?(File.join(dir, 'foo.txt'))).to eq(true)

我建议使用StringIO ,并确保您的SUT接受要写入的流而不是文件名。 这样,可以使用不同的文件或输出(更可重用),包括字符串IO(适用于测试)

所以在你的测试代码中(假设你的SUT实例是sutObject ,并且序列化器被命名为writeStuffTo

testIO = StringIO.new
sutObject.writeStuffTo testIO 
testIO.string.should == "Hello, world!"

字符串IO的行为类似于打开的文件。 因此,如果代码已经可以使用File对象,它将适用于StringIO。


这是如何模拟文件(使用rspec 3.4),因此您可以写入缓冲区并稍后检查其内容:

it 'How to mock File.open for write with rspec 3.4' do
  @buffer = StringIO.new()
  @filename = "somefile.txt"
  @content = "the content fo the file"
  allow(File).to receive(:open).with(@filename,'w').and_yield( @buffer )

  # call the function that writes to the file
  File.open(@filename, 'w') {|f| f.write(@content)}

  # reading the buffer and checking its content.
  expect(@buffer.string).to eq(@content)
end






file-io