2012-09-12 4 views
1

일부 셸 명령을 자동화하는 Ruby 라이브러리를 작성 중입니다. 명령은 상당히 복잡한 비즈니스 로직 집합에 따라 달라집니다.쉘 명령어를 생성하거나 사용하는 단위 테스트 코드는 어떻게 작성합니까?

이러한 셸 명령을 생성하는 코드를 단위 테스트하고 싶습니다. 내가 어떻게 그럴 수 있을지 모르겠다. 커맨드의 정확한 텍스트는별로 신경 쓰지 않지만 커맨드가 로직의 영향을 받는지 확인하고 싶습니다. 물론 유닛 테스트의 목적이기도합니다.

내 생각은 명령 생성을 매우 얇은 템플리트와 같은 객체 (또는 템플릿 만)로 캡슐화하고 쉘 명령을 생성해야 할 때 논리 코드에서 해당 객체를 호출 한 다음 해당 논리 코드를 확인할 수 있습니다 템플릿 코드에서 예상되는 메서드를 호출합니다. 여전히 템플릿 코드는 테스트되지 않은 채로 남아 있지만 로직을 검증하는 것만 큼 중요하지는 않습니다. 기본적으로

class DirectoryMaker 
    def initialize(generator) 
    @generator = generator 
    end 
    def make_directory(name) 
    if name=='baz' 
     raise 'YOURE NOT ALLOWED TO DO THAT' 
    else 
     @generator.mkdir(name) 
    end 
    end 
end 

describe DirectoryMaker do 
    it 'should produce a mkdir command' do 
    generator = double('Generator') 
    generator.should_receive('mkdir').with('foo').and_return('') 

    described_class.new(generator).make_directory('foo') 
    end 

    it 'should raise an exception when passed baz as a name' do 
    expect { 
     described_class.new(double('Generator')).make_directory('baz') 
    }.to raise_error 
    end 
end 

아, 내 질문에 대답 한 것 같습니다.하지만 더 좋은 제안이 있으면 듣게 될 것입니다.

답변

0

나는 당신을 올바르게 이해하고 있는지 잘 모르겠다. 예 콘솔 출력 (모델)의 추상화 인 얇은 레이어를 만들 수 있습니다. 당신은 당신의 논리 (컨트롤러)가이 추상화 레이어로부터 정확한 객체를 생성하는지 테스트 할 수 있습니다. 템플릿이 모델 (뷰)에서 올바른 셸 출력을 렌더링하는지 테스트 할 수 있습니다. 그러나 무엇을 위해? 여기에 완전한 MVC 패턴이 정말로 필요한가요? 문자열을 출력해야하는 논리가 있습니다. 왜 일부 입력 매개 변수가 원하는 문자열을 생성하는지 테스트 할 수 없습니까?

관련 문제