我决定,如果我使用数据提供程序会很好但是当我尝试生成代码覆盖时,整个测试类的覆盖率为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
答案 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()
运行它。
一般情况下,最好尽可能具体地测试某些内容 - 而不仅仅是让它转换为真/假条件。