【问题标题】:How do I write a unit test for a method which removes characters from a text file?如何为从文本文件中删除字符的方法编写单元测试?
【发布时间】:2013-07-11 01:19:01
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您提供您的测试方法的代码示例,您可能更有可能获得代码示例。

标签: ruby rspec shoulda


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 标记了这个测试的描述块,所以没有发生实际的文件系统活动。文件系统是假的,都在内存中。

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 2014-01-06
      • 2022-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多