【发布时间】: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