symfony - 在 Codeception 测试上运行 Symfony 控制台命令不会在 db 上持久更改,不会引发错误
问题描述
我正在尝试运行的测试有一个奇怪的问题。我正在使用一个 sqs 消息订阅一个主题。消息得到处理并且测试通过,但是在测试完成后数据库上没有任何变化。教义没有例外,什么都没有。它只发生在我使用 sqs 时。我创建了一个控制器组件来测试不同的终点,它工作得很好,我可以看到数据库上的变化。
我正在使用 codeception 来设置 sqs 消息。SqsService 类在我调用 QUEUE 后接收消息并返回给我。我有一个命令类,当我从测试运行队列时会调用它:
runSymfonyConsoleCommand('queue:<command>', ['--queue' => <queue-name>])
之后,我想在我的服务类下通过简单地执行此操作来处理消息以对数据库执行更改:
$this->repository->remove($entity);
$this->repository->flush();
我在我的服务中注入了一个接口,用作我的实体存储库的适配器,它扩展了实体管理器。
一切正常,除了数据库中没有预期的变化。我检查了所有教义配置,它们都设置正确。我正在使用 Symfony 4.3.9
有人知道可能导致此问题的原因吗?
解决方案
事实证明,这是一个简单的代码接收组件,将事件分派给教义。看,使用codeception方法时:
runSymfonyConsoleCommand();
在 UnitOfWork 满足 sql 命令之后,您基本上是在告诉学说回滚数据库更改。所以他们没有完全投入。
我的工作是使用一个名为 CLI 的代码接收模块:https ://codeception.com/docs/modules/Cli#seeShellOutputMatches
方法:
runShellCommand($command);
虽然,如果您希望从命令执行中返回一个值,您应该简单地使用内置的 PHP 方法:
shell_exec();
codeception 方法使用 exec(); 在引擎盖下,所以它默认返回 null 。
我希望这可以帮助社区,谢谢。
推荐阅读
- ios - 避免快速覆盖本地通知
- java - 检查一个字符串是否是另一个字符串的子字符串
- c# - TimeZoneInfo.FindSystemTimeZoneById() 不适用于“海湾标准时间”
- c# - 一段时间后,UI 未根据触发器更新
- jinja2 - 在 SaltStack 中使用 Jinja 插入环境变量
- javascript - 在 ngFor 中签署动态 key.value
- c++ - 我如何只从 .txt 文件中读取第二个单词
- python - 在简单的相等上使用 sklearn.cross_val_score
- javascript - 如何从状态访问 React 状态中的另一个键
- javascript - 使用标签数组提高标签算法的性能