PhpUnit dataProviders vs Coverage

时间:2017-12-03 18:45:11

标签: phpunit code-coverage

我决定,如果我使用数据提供程序会很好但是当我尝试生成代码覆盖时,整个测试类的覆盖率为0%。有人可以告诉我为什么吗?

测试类:

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

1 个答案:

答案 0 :(得分:0)

在实际测试开始之前收集DataProvider中的数据 - 并且在testInstances()方法中没有任何有用的测试。

如果您将类名和期望的类传递到testInstances($methodName, $expectedClass)

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

数据提供者可以返回一个可调用的,以及预期的结果:

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

然后你至少在实际测试中运行代码。您也可以更好地传回一个字符串方法名称 - '创建',并在测试中使用本地创建的$ manager实例 - $manager->$method()运行它。

一般情况下,最好尽可能具体地测试某些内容 - 而不仅仅是让它转换为真/假条件。