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的新手。
答案 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条件,您以类似的方式进行。编写一个新的测试,旨在满足条件并测试其中的代码。