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