Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 您的存储库应该通过集成或功能测试进行测试(如果您编写了这样的测试,也可以通过验收)_Php_Sql_Unit Testing_Symfony - Fatal编程技术网

Php 您的存储库应该通过集成或功能测试进行测试(如果您编写了这样的测试,也可以通过验收)

Php 您的存储库应该通过集成或功能测试进行测试(如果您编写了这样的测试,也可以通过验收),php,sql,unit-testing,symfony,Php,Sql,Unit Testing,Symfony,如果您有许多涉及数据库的测试,这可能意味着您在某个地方走错了方向,或者: 代码设计-您的类与数据库耦合 决定如何测试-编写过多的集成测试而不是单元测试 可能值得研究一下测试金字塔: 通过研究如何加快测试速度,你只会继续走上错误的道路。解决方案是编写更多的单元测试和更少的集成测试。单元测试是快速的、独立的和孤立的,因此很难突破。集成测试更加脆弱和缓慢。调查 顺便说一句:SQLite是一条死胡同。它的行为不像mysql,因为它不支持约束 您的示例类可以建模为: 类通知管理器 { 公共函数构造(M

如果您有许多涉及数据库的测试,这可能意味着您在某个地方走错了方向,或者:

  • 代码设计-您的类与数据库耦合
  • 决定如何测试-编写过多的集成测试而不是单元测试
可能值得研究一下测试金字塔:

通过研究如何加快测试速度,你只会继续走上错误的道路。解决方案是编写更多的单元测试和更少的集成测试。单元测试是快速的、独立的和孤立的,因此很难突破。集成测试更加脆弱和缓慢。调查

顺便说一句:SQLite是一条死胡同。它的行为不像mysql,因为它不支持约束

您的示例类可以建模为:

类通知管理器
{
公共函数构造(MyNotificationRepository$repository,MyFabulusService$service)
{}
//…其他方法
}
通过这种方式,您可以注入存储库和服务的假货,并单独测试NotificationManager

单元测试查询构建器没有多大价值,因为您将测试条令而不是代码。这也很难,因为查询类被声明为final。您可以测试查询在功能上是否返回正确的结果。如果您正确地对类进行单元测试,那么所需的功能测试就会少很多


如果您将MyNotificationRepository作为一个接口,您甚至可以与条令解耦

谢谢你的答复。我用一个我试图测试的例子编辑了我的答案,如果你能给我一个你将如何测试与databaseMock理论如此相关的东西的例子,那会很酷吗?o_o不要为存储库编写单元测试;改为编写集成测试。@elnurakhimov不是条令,而是您的存储库。也许我把它放错了:)@ElnurAbdurrakhimov重点是我的类没有数据库就不能工作,它取决于数据库或存储库,所以我不知道如何测试它。我感谢你的回答。我用一个我试图测试的例子编辑了我的答案,如果你能给我一个你将如何测试与databaseMock理论如此相关的东西的例子,那会很酷吗?o_o不要为存储库编写单元测试;改为编写集成测试。@elnurakhimov不是条令,而是您的存储库。也许我把它放错了:)@ElnurAbdurrakhimov重点是我的类没有数据库就不能工作,它取决于数据库或存储库,所以我不知道如何测试它谢谢你编辑你的答案,但是我注入了EntityManager,因为像deleteNotification这样的一些方法不需要存储库,他们需要使用查询生成器进行一些工作。我现在移动了代码以获取存储库中的通知,manager get*方法调用存储库方法您应该将所有查询生成器交互移动到存储库中。但是我必须对需要服务容器的查询进行一些处理。存储库不应该只提供获取数据的方法而不提供设置吗?感谢您编辑您的答案,但是我插入了EntityManager,因为有些方法(如deleteNotification)不需要存储库,它们需要与查询生成器一起工作。我现在移动了代码以获取存储库中的通知,manager get*方法调用存储库方法您应该将所有查询生成器交互移动到存储库中。但是我必须对需要服务容器的查询进行一些处理。存储库不应该只提供一种获取数据的方法而不提供设置吗?
NotificationManagerClass
    constructor(EntityManager)
    loadNotifications()
    deleteNotification()
    updateNotification()