2017-12-03 8 views
0

私は、データプロバイダを使用しても問題ないと判断しましたが、コードカバレッジを生成しようとすると、テストされたクラス全体が0%のカバレッジを持っています。PhpUnit dataProviders vs Coverage

Testクラス:

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], 
     ]; 
    } 
} 

テスト済みクラス:

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; 
    } 
} 

私のコードカバレッジはAuthorDbManagerに0%であるのはなぜ? 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()を使って実行する方が良いかもしれません。

一般的に、真偽の状態に変換するだけでなく、できる限り具体的なものをテストすることをお勧めします。