2017-12-03 9 views
0

데이터 공급자를 사용하면 좋지만 코드 커버리지를 생성하려고 시도하면 전체 테스트 된 클래스가 0 %의 서비스 범위를가집니다. 누군가가 그 이유를 말해 줄 수 있습니까?PhpUnit dataProviders vs Coverage

테스트 클래스 :

class AuthorDbManagerTest extends AbstractDbManagerTest 
{ 
    public function setUp() 
    { 
     parent::setUp(); 
    } 

    /** 
    * @dataProvider instanceOfProvider 
    * @param bool $isInstanceOf 
    */ 
    public function testInstances(bool $isInstanceOf) 
    { 
     $this->assertTrue($isInstanceOf); 
    } 

    public function instanceOfProvider() 
    { 
     $manager = new AuthorDbManager($this->getEntityManagerMock()); 
     return [ 
      "create()" => [$manager->create() instanceof Author], 
      "save()" => [$manager->save(new Author()) instanceof AuthorDbManager], 
      "getRepository" => [$manager->getRepository() instanceof EntityRepository], 
     ]; 
    } 
} 

테스트 클래스 :

내 코드 커버리지가 AuthorDbManager에 0 %를 왜
class AuthorDbManager implements ManagerInterface 
{ 
    protected $entityManager; 
    protected $repository; 

    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
     $this->repository = $entityManager->getRepository(Author::class); 
    } 

    public function create(array $data = []) 
    { 
     return new Author(); 
    } 

    public function getRepository(): EntityRepository 
    { 
     return $this->repository; 
    } 

    public function save($object): ManagerInterface 
    { 
     $this->entityManager->persist($object); 
     $this->entityManager->flush(); 

     return $this; 
    } 
} 

? Screen

답변

0

실제 테스트가 시작되기 전에 DataProvider의 데이터가 수집되므로 testInstances() 메소드 내에서 테스트하는 것이 유용하지 않습니다.

당신은 클래스 명 및 예상 클래스 testInstances($methodName, $expectedClass)에 전달하는 경우 :

public function testInstances(callable $method, $expectedClass) 
{ 
    $this->assertInstanceOf($expectedClass, $method()); 
} 

DataProvider에이 호출을 반환 할 수 있으며, 예상 된 결과 : 다음

"create()" => [[$manager,'create'], Author::class], 

당신이 적어도를 실행 할 것 실제 테스트에서의 코드. methodname - 'create'라는 문자열을 다시 전달하고 테스트에서 로컬로 생성 된 $ manager 인스턴스 - $manager->$method()을 사용하여이를 실행하는 것이 더 나을 수도 있습니다.

일반적으로 가능한 한 구체적인 것을 테스트하는 것이 가장 좋습니다. 단지 참/거짓 조건으로 변환하는 것이 아닙니다.