【问题标题】:PHPunit Mocking not returning specified valuePHPunit Mocking不返回指定值
【发布时间】:2021-07-06 11:23:46
【问题描述】:

我有一个如下所示的控制器类

Class UserController {
  public function getName(){
    return "test_name"
  }

  public function hello(){
    return getName()."!"
  }
}

如下所示的随附单元测试

use PHPUnit\Framework\TestCase;
use App\Http\Controllers\API\User\UserController;

class UserTest extends TestCase{
  public function testExample(){
   $mockGetName = $this->getMockBuilder(UserController::class)->onlyMethods(['getName'])->getMock();
   $mockGetName->method('getName')->willReturn("dummy");

   $userController = new $mockGetName();
   dump($userController->getName("test name"));
   }
}

当被嘲笑时 getName() 返回null 而不是“dummy”。有人知道为什么没有返回指定的返回值吗?

【问题讨论】:

  • 不要在控制器上执行unit test,即feature test。此外,您应该使用Mockery 而不是$this->getMockBuilder()。我不知道它会返回什么,但Mockery 被广泛使用,所以每个人都会更了解它。
  • 非常感谢嘲讽的呐喊。关于前者,我在控制器中模拟了一个简单的辅助函数
  • 不过,您不会将控制器作为单元测试进行测试!如果您需要一个辅助功能并且它在控制器中,那是一个“迷你”警报,表明某些东西设计不正确,因为控制器应该在运行中执行它需要的任何操作(几行代码)或使用服务/帮助器(其他地方的文件/类,但不是控制器)。

标签: php laravel unit-testing phpunit laravel-testing


【解决方案1】:

想通了。我使用createPartialMock 而不是mockBuilder,它会返回所需的内容。

$mockGetName = $this->createPartialMock(UserController::class, ['getName']);
$mockGetName->method('getName')->willReturn("test name");

【讨论】:

    猜你喜欢
    • 2018-06-27
    • 2014-05-20
    • 2015-06-21
    • 2015-02-25
    相关资源
    最近更新 更多