65.9K
CodeProject 正在变化。 阅读更多。
Home

Symfony 实体类的单元测试

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019年1月1日

CPOL

3分钟阅读

viewsIcon

6487

Symfony 实体类的单元测试

引言

为您的 Symfony Entity (Doctrine) 类编写单元测试是一个好主意,这些类是您 Symfony 项目的一部分。 在本文中,我将展示我为“User”实体创建的单元测试示例,该实体代表我在为 Taft College 创建的请愿系统中的一个用户。

创建您的测试文件

作为任何 Symfony 项目的一部分,测试用例应存储在“tests”文件夹下。 文件夹也可以在“phpunit.xml.dist”文件中的“testsuite”标签内指定。 因此,对于一个 Entity,一个好的文件夹路径是

tests\AppBundle\Entity

然后,在我的例子中,我在上面的文件夹下创建了“UserTest.php”文件。

测试用例文件

所有 PHPUnit 测试类都应扩展“PHPUnit\Framework\TestCase”; 因此,要启动一个最小的文件,它将包含以下内容

// tests/AppBundle/Entity/UserTest.php
namespace tests\AppBundle\Entity;

use AppBundle\Entity\User;
use PHPUnit\Framework\TestCase;

class UserTest extends TestCase{
public function testUserCreate(){
$user = new User();	// Create User object.
...
}
}

上面的代码只是创建了一个 User 对象,没有做其他任何事情。 因此,此时,我们需要查看 User 类有哪些方法,并将每个方法(如果可能)添加到我们的测试用例中。

下面是 User 实体在 Eclipse 中的大纲截图

Eclipse User object outline

现在让我们测试 setUserName 方法,并使用 getUserName 进行验证,所以我添加了如下测试代码

public function testUserCreate(){
$user = new User(); // Create User object.
$user->setUserName("Name");

$this->assertEquals("Name", $user->getUserName());
}

所以接下来,让我们测试一下,看看一切是否正常工作,并且我们走在正确的轨道上。

运行 PHPUnit

在 Symfony 的当前版本中,您需要从 Symfony 项目的顶级目录使用以下命令运行 PHPUnit

./vendor/bin/phpunit

仅凭该命令本身用处不大。 我建议使用覆盖率,并仅指定我们创建的单个测试用例,因为我们只想验证这个测试用例是否正常工作。 如果您收到太多的错误/调试消息,将很难进行故障排除。 因此,要仅运行上面的测试用例文件并查看覆盖率,请使用以下命令

./vendor/bin/phpunit --coverage-text tests/AppBundle/Entity/UserTest.php

当上面的命令运行时(通常情况下),它会显示 PHPUnit 的版本、测试/断言的数量,以及用颜色表示的覆盖率(绿色代表良好)。 下面是结果(正常)的截图

Basic Test

此结果表明 User 类的 15 个方法中有 3 个已被调用,这还不够多。 对于测试用例,如果可能,我们需要争取 100% 的方法测试。

最终测试用例

我最终创建了两个测试用例,因为在我在创建的应用程序中,一个 User 需要添加签名,因此将此拆分为第二个测试用例来将签名添加到 User 中非常重要。 这仍然测试 User 的功能。

这是创建 User 的完成的测试用例

public function testUserCreate(){
$user = new User();	// Create User object.
$user->setUserName("Name");
$user->setUserType("Advisor");
$user->setFosUsername("FOS");
$user->setDivision("DIV");
$user->setDivAlt("DIV_ALT");

$sig = new Signature();   // Create a signature.
$sig->setSigType("Advisor_Submit");
$date = date("Y-m-d H:i:s", strtotime('2018-12-31 09:20:35'));
$sig->setSigDate( $date );
$user->addSignature( $sig );

$this->assertEquals("Name", $user->getUserName());
$this->assertEquals("Advisor", $user->getUserType());
$this->assertEquals("FOS", $user->getFosUsername());
$this->assertEquals("DIV", $user->getDivision());
$this->assertEquals("DIV_ALT", $user->getDivAlt());
$this->assertEquals(null, $user->getUserId());
$sigCollection = $user->getUSignatures();
$this->assertEquals($date, $sigCollection->last()->getSigDate());

$user->removeUSignature( $sig );    // Remove the signature.
$sigCollection = $user->getUSignatures();
$this->assertEquals(true, $sigCollection->isEmpty());
}

这是测试将签名添加到用户完成的测试用例

public function testAddSignature(){
$user = new User();	// Create User object.
$user->setUserType("Advisor");

$sig = new Signature();
$sig->setSigType("Advisor_Submit");
$date = date("Y-m-d H:i:s", strtotime('2018-12-31 09:20:35'));
$sig->setSigDate( $date );
$sig->setRecommend("yes");
$sig->setSigExplain("sig_explanation");
$sig->setUser( $user );
$sig->setNotes("some_Notes");

$user->addSignature($sig);
$sigs = $user->getUSignatures();
$this->assertNotEmpty($sigs);
foreach ($sigs as $s){
$this->assertEquals("Advisor_Submit", $s->getSigType());
$this->assertEquals($date, $s->getSigDate());
$this->assertEquals("yes", $s->getRecommend());
$this->assertEquals("sig_explanation", $s->getSigExplain());
$this->assertEquals($user, $s->getUser());
$this->assertEquals("some_Notes", $s->getNotes());
$this->assertEquals(null, $s->getSigId());
}
$sig->removeUser( $user );
$s2 = $user->getUSignatures();
$this->assertEmpty($s2);
}

注意:在创建添加签名的测试用例时,我意识到我不能简单地使用方法 setUser(null) 来删除一个 User; 因此,我不得不添加一个名为“removeUser”的方法,该方法可以正确地删除 User。 有时,您在审查代码和创建测试用例时可能需要这样做。

在添加所有方法的测试用例后,结果输出如下

Basic Test

尽情享用!

© . All rights reserved.