对自定义 symfony 约束进行单元测试

2024-05-11

这应该非常简单,但今天下午它让我发疯,对自定义 symfony 验证器进行单元测试的正确方法是什么?我能找到的所有文章都与我的做法完全相同

class Foo extends Constraint
{
    public string $message = 'The string "{{ string }}" is not a valid foo.';
}
class FooValidator extends ConstraintValidator
{
    /**
     * {@inheritdoc}
     */
    public function validate($value, Constraint $constraint): void
    {
        if ($value !== 'foo') {
            $this->context->buildViolation($constraint->message)
                ->setParameter('{{ string }}', $value)
                ->addViolation();
        }
    }
}
class FooValidatorTest extends TestCase
{

    /** @test  */
    public function validate(): void
    {
        $this->expectNotToPerformAssertions();

        $constraint = new Foo();
        $context    = \Mockery::mock(ExecutionContextInterface::class);
        $builder    = \Mockery::mock(ConstraintViolationBuilderInterface::class);

        $context->shouldReceive('buildViolation')
            ->with($constraint->message)
            ->andReturn($this->builder);

        $builder->shouldReceive('setParameter')
            ->with('{{ string }}', 'foo-bar')
            ->andReturn($builder);

        $builder->shouldReceive('addViolation');

        $validator = new FooValidator();
        $validator->initialize($context);
        $validator->validate('foo-bar', $constraint);
    }
}

这应该有效,而且确实有效,但是它会导致 9 个弃用警告


  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::setGroup()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::setConstraint()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::markGroupAsValidated()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::isGroupValidated()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::markConstraintAsValidated()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::isConstraintValidated()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::markObjectAsInitialized()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

  1x: The "Symfony\Component\Validator\Context\ExecutionContextInterface::isObjectInitialized()" method is considered internal Used by the validator engine. Should not be called by user *           code. It may change without further notice. You should not extend it from "Mockery_0_Symfony_Component_Validator_Context_ExecutionContextInterface".

因为@internal这些方法上的注释。所以如果你正在使用SymfonyTestsListener将弃用设置为 0 会导致测试失败。

有谁知道如何在不被弃用的情况下测试它?我一直在兜圈子。我只尝试过部分模拟ExecutionContextInterface并嘲笑ExecutionContext直接,没有什么区别(后者也被标记为@internal).

我确信有一个非常简单的解决方案,但我一直在兜圈子,我在搜索时发现的所有内容基本上都是使用 PHPUnit 的 createMock 做同样的事情(按照这个速度我可能会这样做......)


看来你可以用这个作为例子https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Tests/Constraints/BlankValidatorTest.php它扩展了 ConstraintValidatorTestCase... 诚然,它只是使用 PHPUnit 模拟来处理某些事情,而使用具体的类来处理其他事情,但我想这就是实现它的方法

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

对自定义 symfony 约束进行单元测试 的相关文章

  • “警告:mysql_query():提供的参数不是有效的 MySQL-Link” - 为什么?

    我的代码有什么问题吗 我不断收到此错误 Warning mysql query supplied argument is not a valid MySQL Link resource in functions php on line 4
  • Laravel 注册成功后如何重定向到上一页?

    现在redirectTo被设定为 home 我想知道如何重定向到上一页 我尝试使用 protected redirectTo URL previous 但我得到解析错误 期待 or 解决这个问题的最佳解决方案是什么 我想我需要重写 redi
  • 使用 Mockito 进行 Android 仪器测试 [重复]

    这个问题在这里已经有答案了 我正在尝试将 Mockito 框架与 android 仪器测试一起使用 但无法正确初始化它 我有以下测试类 class MainKontorTest extends ActivityInstrumentation
  • Laravel 5 配置语言环境,不起作用

    已完成的修改 on 配置 应用程序 php locale gt env APP LOCALE en fallback locale gt en on env APP LOCALE pt 我也复制了 资源 lang en文件到 资源 lang
  • 如何在 SQLite 中获取最后插入的 ID?

    SQLite 中是否有任何内置函数可以获取最后插入的行 ID 例如 在 mysql 中我们有LAST INSERT ID 这种功能 对于 sqlite 任何可用于执行相同过程的函数 请帮我 Thanks SQLite 这可以使用SQLite
  • 使用 CodeIgniter 加载视图文件夹外的视图

    我需要从以下范围之外加载视图 this gt load gt view 这似乎是从base application views目录 如何从外部访问视图 application 目录 我想我将不得不延长CI Loader class这是最好的
  • 使用 PHP 创建、编辑和删除 crontab 作业?

    是否可以使用 PHP 创建 编辑和删除 crontab 作业 我知道如何列出 Apache 用户当前的 crontab 作业 output shell exec crontab l echo output 但是如何使用 PHP 添加 cro
  • 如何接收发送到 twilio 号码的短信

    我在 twilio 创建了一个免费帐户 用于通过我的网站发送短信 注册后 我得到了一个 twilio 号码 例如 XXX XXX XXXX 我可以向手机号码发送消息 但我不知道如何使用这个 twilio 号码接收短信 请帮我解决这个问题 T
  • Zend 框架会话丢失

    我有一个注册表单 当用户注册时 它会将他重定向到他的页面 在 Firefox 和 Chrome 中一切正常 但在 Internet Explorer 中则正常 看起来保存用户信息后 会话就关闭了 并且不会将用户重定向到他的页面 我该如何解决
  • 如何模拟私有内部类

    我有一个 spring 应用程序 我想在像这样的控制器上创建一个单一测试 问题是Wrapper类是私有内部类 所以测试中看不懂Wrapper 是否可以在不更改控制器类的情况下使用 Mockito 来模拟它 我可以使用prepareData
  • 带摘要的 php curl 返回两个响应

    我发现了一个 奇怪 的 php CURL 行为 这让我抓狂 基本上我正在做的是使用curl 进行摘要身份验证的调用 这是我的代码的摘录 curl setopt this gt c CURLOPT HTTPAUTH CURLAUTH DIGE
  • zend框架验证模型中的数据而不是表单中的数据

    使用 Zend Framework 2 在我的应用程序中 要编辑数据库中的数据 可以编译 html 表单或发送 http post 请求 我的服务器作为 Web 服务实现 在第二种情况下 不会呈现表单 问题 如果当服务器收到不是从表单发送而
  • php - 重定向ajax请求[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在 php wordpress 中重定向 ajax 请求 I tried header Location http redirect
  • PHP 搜索部分字符串

    如何在键入时搜索部分字符串 不使用 MySQL 例如 MySQL 中的 LIKE 函数 但在搜索字符串时使用 PHP 例如 但这显然行不通 但是有没有一个函数可以搜索部分字符串 那太好了 EDIT 如果它在数组中怎么办 如果我使用 strp
  • 将 Base64 字符串转换为图像文件? [复制]

    这个问题在这里已经有答案了 我正在尝试将我的 Base64 图像字符串转换为图像文件 这是我的 Base64 字符串 http pastebin com ENkTrGNG http pastebin com ENkTrGNG 使用以下代码将
  • Google Drive V3、Google API 客户端 2.0 - 批量上传失败

    使用 Google Drive V3 和 API v2 0 主分支进行批量上传失败 我已经修改了https github com google google api php client blob master examples batch
  • 如何在没有 SSH 和 CLI 访问生产的情况下部署 symfony 项目 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 大多数托管提供商仅具有 FTP 访问权限 是否可以 常见地进行 symfony 项目 3 x 或 4 x 的本地安装 然后通过 FTP 上
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • SimpleXML 返回空数组

    我正在尝试使用 Google Maps API 和 PHP SimpleXML 获取城市的纬度和经度 我尝试这样做 xml simplexml load file http maps googleapis com maps api geoc
  • 突出显示单词并提取其附近文本的函数

    我有一个文本例如 Etiam porta semmalesuada magna mollis euismod 整数取数 ante venenatis dapibus posuere velit aliquet 埃蒂亚姆 门塔 塞姆 male

随机推荐

  • 游标与更新

    一家公司使用 SQL Server 数据库来存储有关其客户及其业务交易的信息 您所在的城市引入了新的区号 对于前缀小于 500 的电话号码 区号 111 保持不变 前缀为 500 及以上的号码将分配区号 222 客户表中电话列中的所有电话号
  • 强制 Android DateUtils.getRelativeDateTimeString() 忽略设备区域设置?

    我发现使用android text format DateUtils返回 昨天 或 2 小时前 等值的相关 API 非常好 但我的应用程序并不支持 Android 所支持的每种语言 因此 我默认为英语 但对于我不支持的每种语言 相关字符串会
  • 对 Objective-c 对象数组进行排序

    所以我有一个自定义课程Foo有许多成员 interface Foo NSObject NSString title BOOL taken NSDate dateCreated 在另一堂课上我有一个NSMutableArray包含这些对象的列
  • 当重复的行具有不同的值时,如何将 DataFrame 上的重复行合并为一行

    我有一个DataFrame像下面这样 ID NAME TEL 1 TEL 2 TEL 3 1 John 123456 754987 465317 1 John 465987 465987 1 John 546783 2 Robert 264
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • Spring MVC 3:不同控制器中的相同@RequestMapping,具有集中式XML URL映射(混合xml/注释方法)

    我喜欢将所有映射保留在同一个位置 因此我使用 XML 配置
  • AWS Lambda 调用错误未触发 SQS 死信队列

    我有一个 AWS Lambda 函数 它订阅 DynamoDB 流并配置了SQS 死信队列 DLQ https docs aws amazon com lambda latest dg dlq html 我可以看到管理控制台中配置了正确的队
  • Windows 应用程序事实上的标准键盘快捷键列表?

    假设我正在为 Windows 开发一个新的桌面应用程序 是否有我可以查阅的所有 Windows 应用程序都应支持的键盘快捷键列表 来自 Microsoft 或第三方 注意 当我在这里说 所有 Windows 应用程序 时 我的真正意思是 特
  • java中如何制作弹出窗口

    我目前正在开发一个java应用程序 我想显示一个包含文本区域和按钮的新窗口 你有什么想法 同样的答案 J选项面板 http docs oracle com javase 7 docs api javax swing JOptionPane
  • rdstate()返回值是什么意思?

    istream Read istream is std string buf while is gt gt buf cout lt lt is eofbit lt lt lt lt is failbit lt lt lt lt is bad
  • Matplotlib 文本尺寸

    是否可以确定 matplotlib 文本对象的尺寸 如何找到以像素为单位的宽度和高度 Thanks Edit 我想我已经找到办法了 我在下面举了一个例子 import matplotlib as plt f plt figure r f c
  • 无法使用 minikube 设置 Istio

    我按照 Istio 的官方文档为带有 minikube 的示例 bookinfo 应用程序设置了 Istio 但我得到了无法连接到服务器 net http TLS 握手超时错误 这些是我遵循的步骤 我安装了 kubectl 和 miniku
  • 获取强类型的子属性名称

    通过将数据绑定对象到控件和网格 我讨厌属性名称如何成为魔术字符串 因此我创建了一个非常简单的方法 如下所示 public static string GetPropertyName
  • Spring Websocket升级请求处理

    我正在尝试使用Spring Websocket with Sockjs and STOMPjs 如上所述Spring Websocket 文档 https docs spring io spring docs 5 0 0 BUILD SNA
  • Python - 装饰器 - 尝试访问方法的父类

    这不起作用 def register method name None def decorator method The next line assumes the decorated method is bound which of co
  • HTTP 到 HTTPS 301 重定向代码不起作用,显示重定向过多

    我正在为我的网站之一使用 Bluehost 最近 最近 我已将我的网站从 HTTP 迁移到 HTTPS 之后 我使用了不同的代码 包括以下代码 在我的网站上强制使用 HTTPS SSL Rewrite RewriteEngine On Re
  • Ruby 守护进程,用于使临时 Ruby 实例的对象保持活动状态

    Ruby 是否提供了一种在不同运行的 Ruby 进程之间共享变量 更重要的是 类对象和我认为对此有用的任何其他数据抽象 的机制 例如 如果我有一个类被实例化 初始化并仔细调整到某种状态 我希望该状态对我全天所有其他独立的 Ruby 和 Ir
  • 从表单发布触发 AWS Lambda

    我创建了一个小型 AWS Lambda 它使用 SES 发送电子邮件 我正在寻找将联系我们表单从静态网站连接到此 lambda 是否可以将联系我们表单直接发布到 lambda 的 url 我没有使用服务器端框架 并且真的想避免它 我有什么选
  • 嵌套 UIStackViews 打破约束

    我有一个复杂的视图层次结构 在 Interface Builder 中内置 带有嵌套的 UIStackViews 每次我隐藏一些内部堆栈视图时 我都会收到 无法满足的约束 通知 我已经追踪到这一点
  • 对自定义 symfony 约束进行单元测试

    这应该非常简单 但今天下午它让我发疯 对自定义 symfony 验证器进行单元测试的正确方法是什么 我能找到的所有文章都与我的做法完全相同 class Foo extends Constraint public string message