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

时间:2017-12-14 13:06:08

标签: php symfony phpunit symfony-forms

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的新手。

2 个答案:

答案 0 :(得分:0)

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

userEdit方法名称应为userEditAction

选择如下表格: $form = $crawler->selectButton('submit')->form();

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

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

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

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

示例来自official docs

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

这个blog有很好的例子。

答案 1 :(得分:0)

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