我的UserController的PHPunit没有覆盖所有行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的UserController的PHPunit没有覆盖所有行相关的知识,希望对你有一定的参考价值。

Symfony项目phpunit覆盖测试

UserController的

public function userEdit($id, Request $request)
    {

        $user = $this->userRepository->findOneByCode($id);

        if (!$user) {
            throw new Exception("User not found!");
        }

        $userForm = $this->createForm(UserForm::class, $user);
        $userForm->handleRequest($request);

        if ($userForm->isSubmitted() && $userForm->isValid()) {
            $this->userService->save($user);

            return $this->redirectToRoute('user_list');
        }

        return $this->render(
            'user/user.html.twig', [
            'form' => $userForm->createView(),
            ]
        );
    }

TestUserController

public function testUserEdit()
    {
        $client = static::createClient();
        $crawler = $client->request('GET', '/user/test/edit');

        $formData = array(
            'username' => 'test',
            'email' => 'test@test.nl',
            'roles' => 'ROLE_ADMIN'
        );

        $this->assertEquals(
            200,
            $client->getResponse()->getStatusCode()
        );


        $form = $this->factory->create(UserForm::class);
        $object = User::fromArray($formData);

        $form->submit($formData);
        $this->assertTrue($form->isSynchronized());
        $this->assertEquals($object, $form->getData());

        $view = $form->createView();
        $children = $view->children;

        foreach (array_keys($formData) as $key) {
            $this->assertArrayHasKey($key, $children);
        }

    }

在userEdit方法中,我们有一个if循环。但是当我们运行PHPunit coverage测试时,if循环没有被执行。提交的另一个if循环也不包括在内。

出了什么问题,我该怎么办才能完成测试?这也是Symfony表单测试的最佳解决方案,因为我是PHPunit的新手。

答案

我注意到代码中的一些内容似乎有误:

userEdit方法名称应为userEditAction

选择这样的表格:$form = $crawler->selectButton('submit')->form();

“提交”文本是提交按钮上的标签(例如保存)。然后,在填充字段后:$crawler = $client->submit($form);

通过声明生成的HTML页面包含期望元素(例如)来检查提交是否成功:

$this->assertGreaterThan(0, $crawler->filter('h1')->count());

顺便说一句。在实例化客户端后放:$client->followRedirects(true);

例子来自official docs

关于测试未涵盖的一些行:只要你有if子句,就需要测试这两个条件。在你的情况下,首先你可能有一个有效的用户,User的实例,另一种情况应该是你传递一个无效的用户(null或其他)。这通常通过使用@dataProvider注释和方法来完成。数据提供者方法向测试方法提供数据集。可以有多个集合,因此另一个集合包含无效数据以涵盖if()子句的其他结果。

这个blog有很好的例子。

另一答案

要涵盖if条件的内容,您必须满足条件的新测试。要输入第一个,例如,您必须编写一个测试,其中您模拟userRepository并使findOneByCode返回null。然后执行以下if条件并抛出异常。最后,测试测试中抛出的异常。对于其他if条件,您以类似的方式进行。编写一个新的测试,旨在满足条件并测试其中的代码。

以上是关于我的UserController的PHPunit没有覆盖所有行的主要内容,如果未能解决你的问题,请参考以下文章

目标类 [UserController] 不存在 [重复]

xampp phpunit 怎么使用

PHPUnit - 啥都不做,没有错误,没有输出

目标类 [UserController] 不存在 Laravel 8

App\Http\Controllers\User\UserController::me@index 不存在

PHPUnit:找不到我的包类