php 单元测试 麻烦,php – 正确的单元测试
首先,如果可能的話,我想稍微改寫一下這個方法.
public function addUser(User $user)
{
if ($this->doesUserExist($user)) {
throw new UserAlreadyExistException("The user ".$user->getUid()." already exists.");
}
// ... shortened for brevity
$pbnlAccount = $this->userToEntities($user);
$this->ldapEntityManager->persist($pbnlAccount);
}
另一種相關(guān)方法是:
private function doesUserExist(User $user)
{
$users = $this->ldapRepository->findByUid($user->getUid());
return count($users) === 1;
}
我們馬上就可以看到我們基本上有兩個測試:
>我們測試該方法在用戶存在時拋出
>如果用戶不存在,我們測試該方法是否持久存在PbnlAccount.
如果你不明白為什么我們有這兩個測試,請注意這個方法中有兩個可能的“流”:一個是if語句中的塊被執(zhí)行,另一個是不執(zhí)行它.
讓我們解決第一個問題:
public function testAddUserThrowsWhenUserExistsAlready()
{
$user = new User();
$user->setUid('123');
$ldapRepositoryMock = $this->createMock(LdapRepository::class);
$ldapRepositoryMock
->method('findByUid')
->expects($this->once())
->with('123')
->willReturn(new PbnlAccount());
$userRepository = new UserRepository($ldapRepositoryMock);
$this->expectException(UserAlreadyExistException::class);
$userRepository->addUser($user);
}
第二次測試留給讀者練習(xí):)
是的,你必須在你的情況下做一些嘲弄.在這種情況下,您將需要模擬LdapRepository和LdapEntityManager.
注意1:這段代碼可能不是可運行的,因為我不知道你的代碼庫的確切細節(jié)(我把它寫在了我的頭頂),但這不是重點.關(guān)鍵是你要測試異常.
筆記2:
我會將您的函數(shù)重命名為createNewPbnlAccountForUser(User $user),該函數(shù)更長,但更具描述性.
注3:我不確定你為什么要返回$this-> getUserByUid(),因為那似乎是多余的(你已經(jīng)有用戶了),所以我省略了這種情況.
總結(jié)
以上是生活随笔為你收集整理的php 单元测试 麻烦,php – 正确的单元测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样防止家中的油烟污染?
- 下一篇: 西安市安定门附近最近的早市菜市场在哪里?