Unit testing 如何为依赖于某个实体的bundle编写测试

Unit testing 如何为依赖于某个实体的bundle编写测试,unit-testing,symfony,phpunit,symfony5,Unit Testing,Symfony,Phpunit,Symfony5,我一直在为Symfony开发网格包。bundle接收一个Symfony实体,并在此基础上呈现一个gridview 大概是这样的: 类IndexController扩展了AbstractController { 公共函数构造(GridBuilder$grid,BookGrid$userGrid) { $this->grid=$grid; $this->userGrid=$userGrid; } /** *@Route(“/”) */ 公共职能指数() { 返回$this->render('ind

我一直在为Symfony开发网格包。bundle接收一个Symfony实体,并在此基础上呈现一个gridview

大概是这样的:


类IndexController扩展了AbstractController
{
公共函数构造(GridBuilder$grid,BookGrid$userGrid)
{
$this->grid=$grid;
$this->userGrid=$userGrid;
}
/**
*@Route(“/”)
*/
公共职能指数()
{
返回$this->render('index.html.twig'[
“网格”=>$this->grid->build($this->userGrid),
]);
}
}
BookGrid
是从
BaseGridConfigurator
扩展而来的类,它必须实现
getEntity
方法:

类BookGrid扩展BaseGridConfigurator
{
公共函数getEntity()
{
还书::类;
}
}
GridBuilder使用EntityRepository(在本例中为BookRepository)获取实体的元数据,如字段、存储库和QueryBuilder

如果我想为bundle编写单元测试,我需要一个实体类将其传递给GridBuilder。我认为有两种方法可以解决这个问题

  • 创建模拟实体和存储库
  • 在我的测试目录中创建一个真正的实体和存储库类
  • 我的问题是哪种方法是正确的?还有其他方法来测试依赖于实体的捆绑包吗


    谢谢

    假设
    GridBuilder
    使用
    getEntity
    (可能应该重命名为
    getEntityClass
    )从实体管理器内部获取所需的实体存储库,让
    BaseGridConfigurator
    直接提供对实体存储库的访问不是更容易吗?例如,
    getEntityRepository():EntityRepository
    而不是
    getEntity():string
    。我可以想象,如果您只需要实体存储库,那么这将大大减少您必须执行的模拟量

    在任何情况下,关于单元测试实体存储库的主题的建议通常都是针对依赖于单元测试实体存储库的实现的


    但是,如果必须这样做,我将重点介绍一种设计,在这种设计中,您的实现需要尽可能少的与实体存储库的联系点,以便最大限度地减少测试所需的模拟量。但无论如何,我还是会选择嘲笑而不是存根。

    谢谢你的回复。实际上,如果我要求访问
    Repo
    类,这没有任何区别。在这种情况下,我还需要为存储库创建mock或stub,我将面临同样的挑战。就拿最适合你的那个吧