【问题标题】:PhpUnit dataProviders vs CoveragePhpUnit 数据提供者和覆盖范围
【发布时间】:2018-05-17 05:50:30
【问题描述】:

我决定,如果我使用数据提供者就可以了,但是当我尝试生成代码覆盖率时,整个测试类的覆盖率都是 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

【问题讨论】:

    标签: phpunit code-coverage


    【解决方案1】:

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

    如果您将类名和预期类传递给testInstances($methodName, $expectedClass)

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

    dataprovider 可以返回一个可调用的,以及预期的结果:

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

    那么您至少会在实际测试中运行代码。您最好只传回一个字符串方法名 - 'create',然后在测试中使用本地创建的 $manager 实例 - $manager->$method() 运行它。

    一般来说,最好尽可能具体地测试一些东西 - 而不是让它转换为真/假条件。

    【讨论】:

      猜你喜欢
      • 2011-10-21
      • 1970-01-01
      • 2020-06-02
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多