单元测试持久层 - Symfony

2024-03-15

我想在 Symfony2 中测试持久性。我想知道是否更好地模拟实体并提供给实体管理器,或者是否更好地模拟实体管理器并将实体传递给管理器?

我的第一个选择是实体管理器抛出异常,而不是对象不是实体学说。如何在 PHPUNIT 中测试 symfony 的持久性?


而不是写作单元测试你应该写集成测试对于持久层。

单元测试有一条规则“不要嘲笑你不拥有的东西".

您不拥有 Doctrine 类或接口,并且您永远无法确定您对模拟的接口所做的假设是否正确。即使它们在您编写测试时是正确的,您也不能确定 Doctrine 的行为不会随着时间的推移而改变。

每当您使用第三方代码时,您都应该为使用它的任何内容编写集成测试。集成测试实际上会调用数据库并确保该原则按照您认为的方式工作。

这就是为什么最好decouple来自第 3 方的东西。

就教义而言,这很容易。您可以做的事情之一是为每个存储库引入一个界面。

interface ArticleRepository
{
    /**
     * @param int $id
     *
     * @return Article
     *
     * @throws ArticleNotFoundException
     */
    public function findById($id);
}

您可以轻松模拟或存根这样的接口:

class MyServiceTest extends \PHPUnit_Framework_Test_Case
{
    public function test_it_does_something()
    {
        $article = new Article();
        $repository = $this->prophesize(ArticleRepository::class);
        $repository->findById(13)->willReturn($article);

        $myService = new MyService($repository->reveal());
        $myService->doSomething();

        // ...
    }
}

该接口将按照以下原则实现:

use Doctrine\ORM\EntityRepository;

class DoctrineArticleRepository extends EntityRepository implement ArticleRepository
{
    public function findById($id)
    {
        // call doctrine here
    }
}

实现就是您要为其编写集成测试的内容。在存储库的集成测试中,您实际上将调用数据库:

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

class ArticleTest extends KernelTestCase
{
    private $em;
    private $repository;

    protected function setUp()
    {
        self::bootKernel();

        $this->em = static::$kernel->getContainer()
            ->get('doctrine')
            ->getManager();
        $this->repository = $this->em->getRepository(Article::class);
    }

    public function test_it_finds_an_article()
    {
         $this->createArticle(13);

         $article = $this->repository->findById(13);

         $this->assertInstanceOf(Article::class, $article);
         $this->assertSame(13, $article->getId());
    }

    /**
     * @expectedException ArticleNotFoundException
     */
    public function test_it_throws_an_exception_if_article_is_not_found()
    {
        $this->repository->findById(42);
    }

    protected function tearDown()
    {
        parent::tearDown();

        $this->em->close();
    }

    private function createArticle($id)
    {
        $article = new Article($id);
        $this->em->persist($article);
        $this->em->flush();
        // clear is important, otherwise you might get objects stored by doctrine in memory
        $this->em->clear();
    }
}

在其他地方,您将使用将被存根(或模拟)的接口。在其他任何地方你都不会访问数据库。这使您的测试速度更快。

存根中的实体可以简单地创建或存根。大多数时候我创建实体对象而不是模拟它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试持久层 - Symfony 的相关文章

  • 为什么 LinkedIn v2 Share API 在任何 v2/shares 端点上给出权限不足的错误?

    当我调用任何 v2 LinkedIn 共享 API 端点时 例如https api linkedin com v2 socialActions https api linkedin com v2 socialActions share UR
  • 简单的颜色变化

    我正在创建一个用户界面 用户可以在其中更改页面的颜色值 我想要的是获取分配给其背景颜色的值并将其变亮一定程度 我只是想获得一条亮点线 而不必每次都制作新图像 示例 用户将背景颜色设置为 ECECEC 现在我希望某个元素边框变成 F4F4F4
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • 如何通过 PDO 使用密码哈希来使我的代码更安全? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的代码实际上可以工作 但它一点也不安全 我不想使用 MD5 因为它不是那么安全 我一直在查找密码哈希 但我不确定如何将其合并到我的代
  • 如何处理 PHP 中浮点数的奇怪舍入

    众所周知 浮点运算并不总是完全准确 但是如何处理它的不一致之处呢 As an example in PHP 5 2 9 this doesn t happen in 5 3 echo round 14 99225 4 14 9923 ech
  • 有没有办法在不使用 foreach 或其他函数的情况下在 PHP 中内爆关联数组的键和值?

    我有一个像这样的关联数组 myarray array a gt 1 b gt 2 c gt 3 我想显示数组键和值 如下所示 a is 1 b is 2 c is 3 我不想使用 print r 或 var dump 来执行此操作 我也不想
  • 匹配括号内任何字符的正则表达式

    尝试创建一个与括号内的任何字符匹配的正则表达式 我的正则表达式模式是这样的 preg match listanswer answer 括号内的所有字符串都是匹配模式 但问题是 当我尝试匹配例如 this word sample data 它
  • cakephp 1.1 与 php 5.3

    我刚刚从 php 5 1 升级到 5 3 之前在我的服务器上使用 cakephp 1 1 自从升级 或者可能更早 我不确定 以来 我收到以下错误 任何人都可以透露一些信息 Deprecated Assigning the return va
  • 如何使用 PHP 查找目录中的前 5 个文件?

    如何使用 PHP 列出按字母顺序排序的目录中的前 5 个文件或目录 Using scandir array slice array filter scandir path to dir is file 0 5 The array filte
  • 如何销毁一个物体?

    据我所知 很少 有两种方法 var new object Then Method 1 Set to null var null Method 2 Unset unset var 还有其他更好的方法吗 我在这里吹毛求疵吗 您正在寻找unset
  • ajax 会增加还是降低安全性?

    我正在创建一个网站 到目前为止它是纯 PHP 的 我在想 既然很少有人没有启用 JavaScript 我想知道为什么 也许我应该将我的网站创建为一个完全 PHP 的网站 而不使用任何 AJAX 难道是我想错了 可以肯定的是 如果我实施一些
  • 我的 PHP 代码不会将记录插入到 mySQL 数据库表中[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我的网站上
  • 从文本文件 PHP 读取数据

    我只是想知道如何在 php 中读取文本文件 我想让它显示文本文件中的最后 200 个条目 每个条目都在一个新行上 Like John White Jane Does John Does Someones Name 等等 Thanks Use
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • Apache 2.4.9 在启用 ssl 模块并设置 ssl 证书后失败

    Apache 在尝试设置 ssl 证书后抛出以下错误 ssl emerg pid 30907 AH02572 Failed to configure at least one certificate and key for localhos
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • PHP 用星号替换所有字符

    假设我有一个字符串形式的密码 password thisisaplaintextpassword 我怎样才能把它变成下面的样子 password 我想通过电子邮件向用户发送他们的帐户详细信息 但不想发送整个内容 Use 字符串重复 http
  • __callStatic():从静态上下文实例化对象?

    我对 PHP 中的 静态 和 动态 函数和对象如何协同工作感到困惑 特别是在 callStatic 方面 callStatic 的工作原理 您可以有一个普通的班级 MyClass 在班级内您可以 放置一个名为 callStatic 的静态函
  • PHP 文件上传帮助

    div align center div 这是我的代码

随机推荐

  • 如何在 ASP.NET 全球化中配置不变文化?

    我需要将 CurrentCulture 修复为 ASP NET 应用程序中的不变区域性 我怎样才能做到这一点
  • Solidity 中的状态变量是什么?

    我读过一些关于storage memory and view pure 但我并不完全理解它们 我有以下代码 contract struct Random uint32 state uint8 i function main pure int
  • 我可以结束asp.net mvc中视图的渲染吗

    所以我试图找出一种方法 如果我的模型为空 则可以呈现错误消息 并且在该错误消息之后视图应该停止渲染 这可能吗 我的第一个想法是 response end 方法 但主视图将无法完成渲染 这是框架的一部分 我们确实需要自己构建它吗 仅使用 re
  • float 无法转换为 'MirrorDisposition' Swift 什么是mirrordisposition?

    我得到以下代码 let floatValue Float 1 let intValue Int 1 if floatValue intValue println Types and value are equal else println
  • 使用 django 实现一个对请求进行计数的计数器

    我只是想和姜戈一起尝试 我如何实现一个计数器来存储数据库上服务的请求计数 我想统计 GET 请求的数量 我该怎么做才能让它工作 我的模板
  • 如何用hadoop实现自连接/叉积?

    对成对的项目进行评估是常见的任务 示例 重复数据删除 协同过滤 相似项目等 这基本上是具有相同数据源的自连接或叉积 要进行自连接 您可以遵循 减少端连接 模式 映射器将连接 外键作为键发出 将记录作为值发出 因此 假设我们想要对以下数据的
  • 可以在 AS3 中保存 XML 文件

    var xml XML
  • VBA 公式内变量

    我有以下代码 ActiveCell FormulaR1C1 COUNTIF R 54 C 14 R 54 C 90 RC 4 我想用变量 total 替换 90 我尝试了这个但没有成功 Dim total as Integer total
  • 找不到程序集

    我将 ArrayList 序列化为二进制文件 以便通过 TCP IP 发送它 序列化文件是由服务器创建的 我希望能够使用我现在正在编写的客户端对其进行反序列化 但是 当客户端尝试反序列化时 它会抛出 SerializationExcepti
  • 如果没有响应则继续发送请求

    在循环中没有得到响应的情况下 如何继续获取网页 for el of NodeList const url el getAttribute href const res await fetch url if no response below
  • html2canvas 不从外部 css 文件获取 css 样式

    我正在使用 html2canvas 将包含 svg 对象 图像和 html 内容的 div 转换为图像 但它不会从外部 css 文件获取 css 样式 我已将这些 css 类 target 和 Circle 放入外部 css 文件中 有人请
  • 如何在 Jetpack Compose 中实现列表的“对齐中心”功能?

    在具有水平 LinearLayout 的 EpoxyRecyclerView 中 有一个 对齐中心 功能 其工作原理如下 如果我以良好的速度滚动列表 它会继续滚动 直到速度减慢并以项目位于中心为止 如果我缓慢滚动并抬起手指 那么下一个项目就
  • 材质UI下一个对话框文本字段下划线颜色

    如何使用辅助调色板颜色更改对话框内文本字段的下划线颜色 我无法做到这一点 因为文档非常混乱 假设您使用的是material ui next 您可以使用覆盖 in 创建Mui主题 import MuiThemeProvider createM
  • Rails 模型中的实例变量

    我想在 Rails 模型中初始化一个实例变量 该变量将保存一个数组 并且我想在模型中的其他方法中访问该变量 我试过这个 class Participant lt ActiveRecord Base possible statuses exi
  • 根据 Python pandas 中索引的补集挑选元素

    我有一个数据框 我从中选择两个子集 dfs df a and df b 例如在iris数据集 df a iris iris Name Iris setosa df b iris iris Name Iris virginica 获得所有元素
  • 有没有一种方法可以透明地对 SQLAlchemy 对象执行验证?

    有没有办法在设置属性之后 或设置属性时 但在提交会话之前对对象执行验证 例如 我有一个领域模型Device有一个mac财产 我想确保mac属性在添加到数据库或在数据库中更新之前包含有效且经过清理的 mac 值 看起来 Pythonic 方法
  • PHP在提交表单失败后保留表单信息

    你好 我正在 mvc 系统视图中构建一个表单 并且我希望保留所有插入的值 以防表单提交失败 如何做到这一点 我尝试过 字段示例
  • 点击鼠标绘制一个矩形

    可以用鼠标点击画一个矩形吗 我的代码到目前为止还不能工作 你能帮助我吗 private void panel1 MouseClick object sender MouseEventArgs e Graphics g this Create
  • 源码分析工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 C 和 C 的源代码分析和探索工具似乎非常缺乏 是否有任何工具可以用来收集有关 C 和 或 C 源文件的信息 cscope 完成了我需要的
  • 单元测试持久层 - Symfony

    我想在 Symfony2 中测试持久性 我想知道是否更好地模拟实体并提供给实体管理器 或者是否更好地模拟实体管理器并将实体传递给管理器 我的第一个选择是实体管理器抛出异常 而不是对象不是实体学说 如何在 PHPUNIT 中测试 symfon