2013-05-22 2 views
0

연습을 위해 PHP에서 간단한 RESTful API를 만들고 있습니다. 가능한 한 테스트 가능한 코드로 작성하려고합니다. 많은 자습서를 읽고 몇 개의 비디오를 본 후에도 여전히 이것을 디자인하는 방법에 대한 손실이 있습니다.함수가 호출되었는지 테스트하는 방법은 무엇입니까? 의존성 주입?

기본적으로 라우터 클래스를 설정했습니다. 그것은 URL 경로를 컨트롤러 메소드에 매핑하는 역할을합니다.

경로를 추가 한 후 라우터 상태를 쉽게 테스트 할 수 있습니다.

하지만 respond()에서 적절한 클래스 -> 함수 (params)가 호출되었는지 어떻게 테스트 할 수 있습니까?

저는 PHPUnit을 사용하고 있으며, mock에 관해 읽었습니다. 이 컨텍스트에서 어떻게 사용하는지 모르겠습니다.

현재 respond()는 주어진 경로를 파싱하고 메소드를 요청하고 매핑 된 메소드를 호출합니다.

의견이 지적했듯이
private $routes; 

public function __construct() { 
    $routes = array(); 
} 

/** 
* Gets all current routes 
*/ 
public function getRoutes(); 

/** 
* Sets all routes 
*/ 
public function setRoutes($routes); 

/** 
* Routes GET request 
*/ 
public function get(); 

/** 
* Routes POST request 
*/ 
public function post(); 

/** 
* Routes PUT request 
*/ 
public function put(); 

/** 
* Routes DELETE request 
*/ 
public function delete(); 

/** 
* Sets up default paths for a given resource 
*/ 
public function resource(); 



/** 
* Respond to request 
* @return mixed   JSON of resource data 
*/ 
public function respond($req_method, $request); 

/** 
* Returns mapped call info from request method and path 
* @return mixed   An array of the call and params 
*/ 
private function parse($req_method, $request); 
+0

당신이 인스턴스 및 와이어 그것이 TestSpy를 호출을 만들 수 없습니다 컨트롤러 메소드 (호출 된 레코드) 테스트에서 요청 URL을 보낸 다음 올바른 메서드가 호출되면 TestSpy Controller를 검사 할 수 있습니다. – Gishu

+0

테스트 할 메서드 코드를 표시 할 수 있습니까? 정말 귀하의 질문에 대답하는 것이 더 간단합니다 :) 건배! – Cyprian

+0

일반적으로 테스트를 마칠 때까지 코드를 작성하지 않습니다. 나는 _design_ 질문을하고있다. –

답변

0

, 이것은 스파이 또는 조롱 시스템의 좋은 사용 될 것이다 :

여기에 내 현재의 디자인입니다. PHPunit은 mock을 만들고 테스트 할 수있는 능력이 있지만 다른 라이브러리 (Mockery)를 사용하는 것을 선호합니다.

이 코드는 클래스를 만들고 average()을 호출하면 세 번 호출 된 다음 지정된 값을 반환한다는 것을 테스트합니다.

shouldReceive('get')->once() (예 :)을 설정 한 후 코드에서 respond()를 호출합니다. teardown의 m :: close는 get()이 한 번 호출되었음을 확인하고 그렇지 않은 경우 테스트를 실패합니다.

<?php 
use \Mockery as m; 
class TemperatureTest extends PHPUnit_Framework_TestCase 
{ 
    public function tearDown() 
    { 
     m::close(); 
    } 
    public function testGetsAverageTemperatureFromThreeServiceReadings() 
    { 
     $service = m::mock('service'); 
     $service->shouldReceive('readTemp')->times(3)->andReturn(10, 12, 14); 
     $temperature = new Temperature($service); 
     $this->assertEquals(12, $temperature->average()); 
    } 
} 

당신이 응답에 일을() 할 수있는 실제 클래스를 호출하는 것 때문에, 당신이 필요합니다 'partial mock'

$restful= m::mock('RestfulController[get]'); 
$restful->shouldReceive('get')->once(); 
+0

고마워, 앨리스 터. 나는 PHPUnit과 Mockery 모두를 조롱하는 것에 익숙하다. 그러나 방법으로, 나는 방법의 구현에 '너무 깊이'테스트 할 수있는 것처럼 느낀다. 컨트롤러가 모델과 상호 작용하는지 테스트하고 싶을 때 동일한 문제가 있습니다. –