【问题标题】:Symfony - mocking token storage interface and return user objectSymfony - 模拟令牌存储接口并返回用户对象
【发布时间】:2021-12-03 15:04:24
【问题描述】:

在我的服务方法中,我正在嘲笑我在用户表中保留实体的部分,例如:

$user = $this->tokenStorage->getToken()->getUser();
$userFirstName = 'Unknown user';

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

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

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()

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

或者也许这不是测试这种情况的正确方法?有人可以帮助我编写测试的新手..

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

【问题讨论】:

    标签: php unit-testing symfony testing


    【解决方案1】:

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

    说,你真的应该don't mock what you don't own(基本上,不要模拟第三方代码)因为你无法控制它。这种测试应该从两个方面改进

    1. 不要在单元级别进行测试,而是在集成/功能/e2e 级别进行测试。

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

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

    注意这句话

    我可以使用这个测试方法的返回值并使用它的用户对象来测试我保存这个用户对象的整个方法

    如果我理解正确,您是在尝试在这里测试私有方法吗?如果是这样,请不要这样做,只测试您的类的公共 API(公共方法)。相反,如果这是一个公共方法,即使它被另一个公共方法使用,也可以对其进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2021-04-12
      • 2017-07-16
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多