2011-03-16 2 views
3

간단한 라이브러리를 쓰면, mysql 서버가 살아 있고 결과에 종속된다는 검사가 다른 일을합니다. 연결을 확인하려면 다음 코드를 사용하십시오.시스템 명령어를 사용하는 코드를 테스트하는 방법

def check_connection 
    result = if @password 
    `mysqladmin -u#{@username} -p#{@password} ping` 
    else 
    `mysqladmin -u#{@username} ping` 
    end 
    parse_result(result) 
end 

이 방법을 테스트하는 방법은 무엇입니까? 내 생각에, 나는 테스트하는 동안 MySQL 서버에 연결하면 안된다. 오직이 방법을 조롱

def check_connection(ping_string) 
    `#{ping_string}` 
end 

모든 테스트에 따라서에만이 방법을 사용 명령 : 내가 가지고 만 생각 핑 (암호 사용의 따라 다름)을위한 하나의 방법 적절한 문자열 명령에 돌아가 같은 방법을 사용하는 것입니다 .

제대로 테스트하려면 어떻게해야합니까?

답변

1

당신은 당신의 원본 코드를 고수하고, 이런 식으로 접근 할 수

  1. parse_result는 단위 테스트되어 있는지 확인합니다.
  2. 모크 check_connection 나머지 테스트가 mysqladmin으로 전화를 트리거하지 않도록하십시오.

MySQL 자체에 대한 연결 테스트를 거치지 않았지만 큰 문제는 아니라고 생각합니다. 테스트 ping_string은 실제로 그 구멍을 막지는 않을 것이고, mysqladmin에 대한 호출이 기본적으로 하드 코딩되어 있으므로 여기 위험은 작습니다.

0

system 명령을 사용하는 경우 역 따옴표 (``) 대신 테스트에서 제외 할 수 있습니다. 테스트에서

class Thing 
    def check_connection 
    result = system "some command" 
    parse_result result 
    end 
end 

(난 그냥 그림 RSpec에 구문을 사용합니다)이 같은 테스트 할 수 : 그래서 당신은이 클래스를 가지고 말할 수

it 'should check the connection' do 
    thing = Thing.new 
    thing.should_receive(:system).and_return "some result" 

    thing.check_connection 
    # whatever checking you want to make with the parse_result method 
end 

이 작동 일반적으로 시스템 때문에 메서드가 Kernel#system으로 전달되면 실제 시스템 호출이 수행됩니다. 테스트에서 Thing의 인스턴스가 실제 호출에서 예상 할 수있는 일부 출력으로 시스템 메소드에 응답하도록 허용하고 있습니다.

관련 문제