为文件输入创建Ruby RSpec测试用例

时间:2010-07-30 08:37:39

标签: ruby rspec

我有一个文本文件,我打算将其转换为CSV(在本例中)格式。如何创建正确的RSpec测试以查看输出是否采用适合以下方案的格式?

这是我的代码:

class ProcessLog
    @@log = Array.new
    def read_log(log)
        if File.exists?(log) 
            f = File.open(log, "r")
        f.each_line { |line| @@log << line.strip }
        end
    end
    def process_log
       result = Array.new
       @@log.each do |line|
          <convert to csv>
          result << <converted to csv>
       end
       result
    end
end

describe ProcessLog do
    before do
        @pl = ProcessLog.new
        <help>
    end
    it 'should pass first format' do
        text = "Item X has a price of $ per gram" # just as an example
        <help>
        @pl.read_log("file.log")
        @pl.should == 'X,$,gram'
    end
end

1 个答案:

答案 0 :(得分:1)

首先,当您需要实例变量(@@log)时,您正在使用类变量(@log)。但实际上没有理由使用它们。

我会像这样拆分这些方法,所以你可以单独测试它们:

  • 将文件读取到数组并返回数组
  • 的一种方法
  • 一种采用数组并按照您希望的方式格式化它们的方法,返回格式化数组

现在你的方法是紧密耦合的,因为它们都使用了实例变量,并且它使得测试比它需要的更难(你必须设置或伪造第一种方法的调用以开始测试第二种方法)

您可以使用类似FakeFS的内容测试第一个方法来读取(假)文件的内容。实际上,这种方法应该是相当简单的,你可能根本不需要测试它。

第二种方法在将耦合移到第一种方法时更容易测试。从您希望解析的文件中创建一个行数组,并将其传递给该方法,然后检查结果。