我有一個與以下相同的界面:interface UserRepository{ public function save(User $user): User;}我需要為此函數編寫一個單元測試public function action(){ $data = $this->request->getParsedBody() ?? []; $user = new User($data); $this->userRepository->save($user);}我嘗試模擬用戶存儲庫界面$app = $this->getAppInstance();$container = $app->getContainer();$user = new User(['a' => 'b']);$userRepositoryProphecy = $this->prophesize(UserRepository::class);$userRepositoryProphecy ->save($user) ->willReturn($user) ->shouldBeCalledOnce();$container->set(UserRepository::class, $userRepositoryProphecy->reveal());但返回TypeError : Double\UserRepository\P1::save() 的返回值必須是 App\Domain\User\User 的實例,返回 null我使用 slim-sketch 和 phpunit
1 回答

慕斯709654
TA貢獻1840條經驗 獲得超5個贊
您的測試用例丟失,但我猜您在測試中保存的用戶與您用于設置模擬的用戶不同。為了澄清:
$userA = new User(['a' => 'b']);
$userB = new User(['c' => 'd']);
$prophecy = $this->prophesize(UserRepository::class);
$prophecy->save($userA)
->willReturn($userA)
->shouldBeCalledOnce();
$repo = $prophecy->reveal();
$repo->save($userA); // returns $userA
$repo->save($userB); // returns null
如果您的用戶存在您無法控制且不想消除的副作用,您可以使用回調來檢查給定用戶是否是您正在尋找的用戶。
$prophecy->save(Argument::that(fn(User $user) => $user->data === ['a' => 'b']))
->willReturnArgument()
->shouldBeCalledOnce();
- 1 回答
- 0 關注
- 170 瀏覽
添加回答
舉報
0/150
提交
取消