【发布时间】:2021-09-14 04:40:25
【问题描述】:
我正在尝试在模型中模拟一个方法,以便能够在不同的场景下测试控制器 api 端点。
我目前正在使用带有 PhpUnit 和 Mockery 包的 Laravel 8。 在路由中我使用的是Route模型绑定。
api.php
Route::get('/api/{project}', [ProjectController::class, 'show']);
ProjectController.php
class ProjectController extends Controller
{
public function show(Project $project)
{
$state = $project->getState();
return response()->json($state);
}
}
ProjectControllerTest.php
class ProjectControllerTest extends TestCase
{
/**
* @test
* @group ProjectController
*/
public function shouldReturn200ForValidProjectGuid()
{
$project = Project::factory()->create();
$mock = Mockery::mock(Project::class);
// I have also tried this, see error below
// $mock = Mockery::mock(Project::class)->makePartial();
$this->app->instance(Project::class, $mock);
$mock->shouldReceive('getState')->andReturn('New South Wales');
$response = $this->getJson("/api/{$project->guid}");
$response->assertStatus(200)
->assertJson([
'data' => 'New South Wales'
]);
}
}
我目前收到此错误
Received Mockery_0_App_Models_Project::resolveRouteBinding(), but no expectations were specified Exception caught at [/usr/src/app/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(34) : eval()'d code@924
我已经尝试了其他选项,例如 makePartial(),但是它也会导致以下错误
Received Mockery_0_App_Models_Project::__construct(), but no expectations were specified Exception caught at [/usr/src/app/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php(34) : eval()'d code@924
任何帮助将不胜感激,谢谢
【问题讨论】:
-
为什么不使用标准模拟 phpunit $stub = $this->createMock(SomeClass::class) ?
-
@АлександрЧерножуков 我试过用它,但还是不行,你能提供一个例子吗
-
我读到了在mock上调用
resolveRouteBinding方法的错误信息,但是mock不知道如何处理这个调用,因此抛出了异常。在让系统使用模拟之前,实际指定这个缺失的期望会有所帮助。 -
@hakre 你能提供一个例子吗
标签: php laravel eloquent phpunit mockery