如何为从文本文件中删除字符的方法编写单元测试?

时间:2013-07-11 01:19:01

标签: ruby rspec shoulda

我需要对一个删除所有特殊字符的方法进行单元测试,例如,:和一些空格。

测试中的方法将文件的每一行存储在一个单独的数组位置。

如何测试方法是否删除了文本文件的所有特殊字符?

2 个答案:

答案 0 :(得分:1)

在方法调用后编写文件并使用正则表达式以确保没有您不想要的特殊字符。或者将文件内容与包含您希望实现的结果的文件进行比较。

答案 1 :(得分:0)

fakefs gem对这类事情有好处。

在您的规格设置中(通常为spec_helper.rb):

require 'fakefs/spec_helpers'

RSpec.configure do |config|
  config.treat_symbols_as_metadata_keys_with_true_values = true
  config.include FakeFS::SpecHelpers, fakefs: true
end

这是测试中的代码。此函数删除所有标点符号:

require 'tempfile'

def remove_special_characters_from_file(path)
  contents = File.open(path, 'r', &:read)
  contents = contents.gsub(/\p{Punct}/, '')
  File.open(path, 'w') do |file|
    file.write contents
  end
end

最后,规范:

require 'fileutils'

describe 'remove_special_characters_from_file', :fakefs do

  let(:path) {'/tmp/testfile'}

  before(:each) do
    FileUtils.mkdir_p(File.dirname(path))
    File.open(path, 'w') do |file|
      file.puts "Just a regular line."
    end
    remove_special_characters_from_file(path)
  end

  subject {File.open(path, 'r', &:read)}

  it 'should preserve non-puncuation' do
    expect(subject).to include 'Just a regular line'
  end

  it 'should not contain punctuation' do
    expect(subject).to_not include '.'
  end

end

因为我们使用 fakefs 标记了此测试的describe块,所以没有发生实际的文件系统活动。文件系统是假的,都在内存中。