데이터베이스 연결을 관리하는 클래스에서 TDD를 사용하려고합니다. 그러나인스턴스 조롱 및 암시 적 생성자
- 나는 종종 난 그냥도 SQLite는
- 내가 연결을 테스트 할 수있는 데이터베이스가 사용할 수있는 네트워크에서 멀리 개발하고 플랫폼 독립적 인 방식 (예 : MySQLi 객체 용 PDO 객체 교환 등). 특히 데이터베이스가 모두 MySQL이 아니기 때문에 일부는 SQLServer입니다.
:memory:
로, 실제 연결에 대한 클래스없는 혼란을 테스트 할
는 기본적으로 나는이 작업을 수행 할 수 :
class ConnectionManager {
...
public function getConnection($name) {
$params = $this->lookup($name);
return new \PDO($params['spec'], $params['username'], $params['password']);
}
}
그리고 내 테스트 러너에
:class ConnectionManagerTest extends \PHPUnit_Framework_TestCase {
public function testGetConnection() {
$cxn = new ConnectionManager();
$this->assertNotNull($cxn->getConnection('test')); // or whatever
}
}
은 어떻게 든 내가 PDO 클래스의 모의를 사용하고 싶습니다. 명시 적 매개 변수를 테스트 클래스 생성자 또는 메서드 중 하나에 추가하는 유일한 방법은 무엇입니까? 나는 Mockery 문서에 따라 '인스턴스 조롱 (mocking)'을 시도했지만, 자동 로딩을 사용하면 '치명적인 오류는 클래스를 재 선언 할 수 없다'(duh).
나는 테스트에서 순전히 사용 된 코드로 계약을 오염시키지 않기를 원하지만 그게 유일한 방법입니까? 당신의 도움이
연결 관리자는 항상 (항상) 'PDO'를 반환합니다. 이제 테스트가 시작되면 다른 연결 관리자가 먼저 필요할 것입니다. – hakre
사실 PDO가 여러 가지 연결 유형을 지원하기 때문에 연결 관리자 문제는 다소 덜 중요합니다. 주요 문제는 네트워크 외부에서 개발할 때 실제 연결을 사용할 수 없다는 것입니다.그리고 나중에이 '평범한 오래된 PHP 객체'를 프레임 워크에 넣어야 할지도 모르겠지만 어느 것을 알지 못하기 때문에 가능한 구현과 무관 한 사람이되고 싶습니다. – excatholica
글쎄, 나는 이름 때문에 찔렀다. 이 작업이 필요하다면,'ConnectionManagerStub 클래스를 작성하여 ConnectionManager'를 확장 한 다음 테스트 할 필요가있는 클래스를 변경하여 종속성을 없애고 스텁에서 협업을 유지하십시오. PDO를 전혀 사용하지 않는 테스트 (또는 메모리에있는 PDO 또는 PDO를 사용하지 않는 PDO). – hakre