2010-07-30 2 views
0

CSV (이 경우) 형식으로 변환 할 텍스트 파일이 있습니다. 출력이 다음과 같은 시나리오에 적합한 형식인지 알기 위해 적절한 RSpec 테스트를 어떻게 만들 수 있습니까? 당신이 인스턴스 변수 (@log)을 할 때파일 입력을위한 Ruby 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

먼저, 클래스 변수 (@@log)를 사용하는 :

이 내 코드입니다. 하지만 실제로 그 중 하나를 사용할 이유가 없습니다. 배열에 파일을 읽고, 배열을 배열을 취하는

  • 한 가지 방법을 반환

    • 한 가지 방법 : 당신이 고립을 테스트 할 수 있도록

      나는과 같이 이러한 방법을 분할 할 형식화 된 배열 반환 형식 :

    지금은 메서드 변수가 모두 인스턴스 변수를 사용하고 있기 때문에 메서드가 밀접하게 결합되어 있으므로 테스트가 더 어려워집니다. 호출을 첫 번째 메소드로 가짜로 만들거나 가짜로 만든다. 두 번째 테스트 시작).

    FakeFS과 같은 첫 번째 방법을 테스트하여 (가짜) 파일의 내용을 읽을 수 있습니다. 정말로이 방법은 상당히 사소한 것이어야하며, 전혀 테스트하지 않아도됩니다.

    두 번째 방법은 첫 번째 커플 링을 제거 할 때 테스트하기가 쉽습니다. 파싱 ​​할 것으로 예상되는 파일에서 줄의 배열을 만들고이를 메서드에 전달하고 결과를 확인합니다.

  • +0

    이전 버전과 매우 비슷합니다. 그런데, 필자는 로그를 필요로하는 몇 가지 메서드를 추가하고 모든 메서드에 대한 매개 변수로 로그를 전달하는 종속성을 제거하려고했습니다. : - \ –