Symfony - mock令牌存储接口并返回用户对象



在我的服务方法中,我嘲笑我有一部分我从用户表中持久化实体,如:

$user = $this->tokenStorage->getToken()->getUser();
$userFirstName = 'Unknown user';
$new = new MyEntity();
if ($user != 'anon.') {
$new->setUserId($user);
$userFirstName = $user->getFirstName();
}

我在一个单独的测试方法中编写该部分,我想返回特定的User对象,这意味着我想测试它..

public function testUser()
{
$tokenStorage = $this->createMock(TokenStorageInterface::class);
$userRepo = $this->createMock(UserRepository::class);
$username = ['username' => 'test@test.com']; // this will find the entry in the DB
$testUserObject = new User();
$userRepo->expects($this->any())
->method('findOneBY')
->with($username)
->will($this->returnValue($testUserObject));
$user = $tokenStorage->getToken()->getUser();
$this->assertEquals($testUserObject, $user);
}

但是我得到:

错误:在null

上调用成员函数getUser()

和我认为这是用户在我的测试数据库..

或者这不是测试这种情况的合适方法?有没有人能帮我一下,我是一个写测试的新手。

另一个问题是,我可以使用这个测试方法的返回值并使用它的用户对象来测试整个方法吗?

关于错误,您不是在说$tokenStorage->getToken()将返回什么。当您模拟令牌存储时,您没有存根的getToken调用最终返回null值。

说,你真的不应该嘲笑你不拥有的东西(基本上,不要嘲笑第三方代码),因为你无法控制它。这种测试应该从两个方面加以改进

  1. 不要在单元级别测试,而要在集成/功能/端到端级别测试。

  2. 为令牌存储编写您自己的抽象(如果这是一个应用程序服务而不是域服务,则可能无用)

当然,没有人阻止你嘲笑你不拥有的东西,那只是一个建议。

关于这句话

我是否可以使用这个测试方法的返回值并使用它的用户对象来测试整个方法,其中我持久化了这个用户对象

如果我理解正确的话,你是在测试一个私有方法吗?如果是这样,就不要这样做,只测试类的公共API(公共方法)。相反,如果这是一个公共方法,那么测试它是完全可以的,即使它被另一个公共方法使用。

相关内容

  • 没有找到相关文章

最新更新