2014-01-27 5 views
0

현재 API의 세부 정보를로드하는 패키지를 작성하고 있습니다. 나는 그것을위한 시험을 쓰고있어 그리고 나는 그것을하는 최선의 방법이 확실하지 않다. api 테스트에는 사이트에 대한 요청이 포함되므로 가능한 경우 문제의 api가 세계에서 가장 빠르지 않기 때문에이를 피하고 싶습니다.SimpleXML HTML 호출 조롱

페이지에서 XML을로드하고 해당 페이지를 실제로로드하지 않고 원하는 개체로 변환하는 가장 좋은 방법은 무엇입니까?

답변

2

나는 마침내 내가 우리는 다음과 같은 작업을 수행하는 클래스 쓸 수 바보

것을 깨달았다 브레인 웨이브이었다 해결 방법 :

class XMLReader { 
    function parse($url) { 
    return simplexml_load_file($url) 
    } 
} 

우리는 그 다음에이 클래스를 삽입 할 수 있습니다 API 클래스

class Api { 
    protected xmlreader; 
    public function __construct(XMLReader $xmlreader) { 
    $this->xmlreader = $xmlreader; 
    } 

    public function apiCall($params) { 
    $url = getUrlFromParams($params); 
    $apiAnswer = $this->xmlreader->parse($url); 
    } 
} 

이제 XMLReader 클래스를 조롱하고 온라인 파일 대신 로컬 파일을 구문 분석하도록 할 수 있습니다.

$mock = Mockery::mock('XMLReader'); 
$mock->shouldReceive('parse')->with('http://www.boardgamegeek.com/xmlapi/boardgame/13291?versions=1')->andReturn(simplexml_load_file('tests/13291.xml'))->once(); 
$api = new Api($mock); 
$game = $api->getBoardGame($this->gameID); 
0

XML 처리와 네트워크 요청을 별도로 테스트해야합니다.

XML 구문 분석을 테스트하려면 XML 예제를 수동으로 가져 와서 디스크에 저장 한 다음 조명기로 사용하십시오. 구문 분석 클래스는 XML 문자열을 입력으로 가져와 원하는 객체를 출력해야합니다. 따라서 테스트에서 XML을 얻기 위해 API를 호출하는 대신 디스크에서로드하고 생성 된 객체가 예상되는지 여부를 확인하기 위해 삽입합니다. 이렇게하면 나쁜 XML이나 원하는 것을 시뮬레이션 할 수도 있습니다.

요청에 대해서는 API를 사용하기 위해 사용하고있는 말풍선이나 라이브러리에 대한 올바른 호출을 테스트하십시오.

그런 다음 프로세스가 올바르게 연결되었는지 확인하기 위해 전체 프로세스를 수행하는 일부 통합 테스트를 작성할 수도 있습니다. 하지만이 통합 테스트에서는 모든 XML 유형을 테스트 할 필요가 없으며 하나 또는 두 가지 유형 만 테스트하면됩니다.

+0

그러나 올바른 경우 Simplexml_load_file을 사용하는 경우 실제로 네트워크 요청 또는 구문 분석을 테스트 할 필요가 없습니다. simplexml_load_file은 내가 사용할 수있는 XML 문서를 반환 할 것이라고 확신 할 수 있습니다. 호출을 모의하고 SimpleXML 객체를 다시 얻는 방법을 잘 모르겠습니다. – DrugCrazed

+0

주석으로, 생성하는 객체가 SimpleXML 객체 인 경우 생성을 테스트 할 필요가 없습니다. 어쨌든 테스트에서 API를 사용하기 위해 네트워크를 사용하지 않으려는 경우 API 호출을 시뮬레이트하기 위해 디스크에서 응답을로드해야합니다. – gontrollez