【发布时间】:2018-09-19 14:14:18
【问题描述】:
我正在尝试使用 Codeception 在测试工具中获取 Symfony 控制器。每个方法的开头如下:
public function saveAction(Request $request, $id)
{
// Entity management
/** @var EntityManager $em */
$em = $this->getDoctrine()->getManager();
/* Actual code here
...
*/
}
public function submitAction(Request $request, $id)
{
// Entity management
/** @var EntityManager $em */
$em = $this->getDoctrine()->getManager();
/* 200+ lines of procedural code here
...
*/
}
我试过了:
$request = \Symfony\Component\HttpFoundation\Request::create(
$uri, $method, $parameters, $cookies, $files, $server, $content);
$my_controller = new MyController();
$my_controller->submitAction($request, $id);
从我的单元测试来看,但似乎还有很多我不知道 Symfony 在后台执行的其他设置。每次我找到一个丢失的对象并对其进行初始化时,都会有另一个对象在某个时候失败。
我也尝试过从 PhpStorm 逐步完成测试,但是 PhpUnit 有一些输出导致 Symfony 在接近我要测试的代码之前死掉,因为它无法启动 $_SESSION发生了输出。我认为这不会发生在命令行中,但我还没有真正接近到可以说出来。
如何在单元测试中简单且可扩展地运行此代码?
一点背景:
我继承了这个代码。我知道它很脏而且有异味,因为它在控制器中执行模型逻辑。我知道我要求的不是“纯”单元测试,因为它几乎涉及整个应用程序。
但我需要能够自动运行这个“小”(200 多行)代码。代码应该在不超过几秒钟的时间内运行。我不知道要多久,因为我一直无法独立运行它。
目前,通过网站运行此代码的设置时间很长,也很复杂。该代码不会生成网页,它基本上是生成文件的 API 调用。在进行编码更改时,我需要能够在短时间内生成尽可能多的这些测试文件。
代码就是这样。能够对其进行更改是我的工作,而目前我什至无法在每次运行它的情况下都没有巨大的开销。在不知道它在做什么的情况下对其进行更改是不负责任的。
【问题讨论】:
-
/* 200+ lines of procedural code here我认为是时候将一些业务逻辑卸载到模型中了,你猜怎么着,它会更容易测试。控制器是 MVC 的粘合剂,它们并不意味着做出超出模型将它们绑定在一起并将其放在视图中所需的决策...... -
@ArtisticPhoenix 目标:1. 不破坏任何东西,2. 了解代码在做什么,3. 重构以便任何人都能理解它在做什么。我几乎需要对所有这些进行单元测试。
标签: php unit-testing symfony phpunit codeception