문제

TDD를 사용하지 않은 오래된 코드가 있습니다. 이제 다음과 같은 기능에 대한 테스트를 작성하고 싶습니다.

function somefunction($someargs){
    // do a few checks on $someargs
    $database = new DB_PG();
    $result = $database->select($query);
    // do some changes on result
    return $result;
}

PHPUNIT 및 테스트에 대해별로 만료되지 않았기 때문에 내 질문은 다음과 같습니다. 어떻게 DB_PG를 조롱 할 수 있습니까? 테스트에서 getMock ()을 시도했지만 함수는 "새"를 사용하여 인스턴스를 가져 오기 때문에 Mock Object가 무시됩니다.

그래서 나는 2 가지 옵션 만 본다

  1. 내가 모르는 phpunit의 일부 기능 - 내가 여기서 묻는 이유 ^^
  2. 이전 코드를 수정해야합니다.

그렇다면 옵션 1에 대한 답을 아는 사람이 있습니까?

thx 모두

도움이 되었습니까?

해결책

옵션 1

다음과 같이 작동하도록 기능을 변경할 수 있습니까?

function someFunc($existingArgs, $db = null)
{
    $db = (is_null($db)) = new DB_PG();
    $result = $db->select($query)

    $return $result;
}

이렇게하면 DB 인스턴스를 전달할 수 있습니다.이 기능을 테스트 할 수 있습니다.이 기능은 적어도이 기능을 테스트 할 수 있습니다. 향후 일부는 Nodfunc의 작업이 모델에 관한 것이며 DB로드 작업은 DAO/Repository/Factory를 통해 발생합니다.

옵션 2

DB_PG 가이 함수가 존재하는 파일에 요구/포함/포함을 통해 아직 가져 오지 않은 경우 테스트 클래스 내에서 더미 클래스를 정의 할 수 있습니다.

class DB_PG
{
    public function select($query)
    {
        //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
        return $mockResult;
    }
}

그렇게하면 결과에서 발생하는 일을 제어 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top