未定义的属性:Laravel 单元测试中的 Mockery_3_App_Repositories_ArticleRepositoryInterface::$id
Posted
技术标签:
【中文标题】未定义的属性:Laravel 单元测试中的 Mockery_3_App_Repositories_ArticleRepositoryInterface::$id【英文标题】:Undefined property: Mockery_3_App_Repositories_ArticleRepositoryInterface::$id in laravel unit test 【发布时间】:2021-02-23 19:38:41 【问题描述】:我正在尝试测试 ArticleController 的“存储”方法。当我运行 phpunit 时,我得到了 -
ErrorException: Undefined property: Mockery_3_App_Repositories_ArticleRepositoryInterface::$id
ArticleController.php
public function store(StoreArticle $request)
$article = $this->article->create([
'id' => Str::uuid(),
'user_id' => $request->user()->id,
'category_id' => request('category'),
'title' => request('title'),
'description' => request('description')
]);
return Redirect::route('frontend.articles.show', $article->id);
ArticleControllerTest.php
public function testStoreSuccess()
$this->withoutMiddleware();
$this->mock(StoreArticle::class, function ($mock)
$mock->shouldReceive('user')
->once()
->andReturn((object) ['id' => Str::uuid()]);
);
$this->mock(ArticleRepositoryInterface::class, function ($mock)
$mock->shouldReceive('create')
->once();
Redirect::shouldReceive('route')
->with('frontend.articles.show', $mock->id) // error occurs on the $mock->id portion
->once()
->andReturn('frontend.articles.show');
);
$response = $this->post(route('frontend.articles.store'));
$this->assertEquals('frontend.articles.show', $response->getContent());
我正在使用存储库模式。 ArticleRepositoryInterface 和 eloquent ArticleRepository 与服务提供者绑定。
【问题讨论】:
【参考方案1】:您需要返回一个表示Article
实例的对象:
// Assuming you have an Article model, otherwise stdClass could be instead.
$instance = new Article();
$instance->id = 123;
$mock->shouldReceive('create')
->once()
->andReturn($instance);
那么导致错误的那一行就变成了:
->with('frontend.articles.show', $instance->id)
另一个问题是这一行:
->andReturn('frontend.articles.show');
控制器方法返回重定向响应对象的实例,而不是字符串。
【讨论】:
非常感谢! stdClass 完成了这项工作。我无法使用 assertRedirect,因为 $instance->id 在 $this->mock 之外不可用。重定向的路由是“frontend.articles.show”。因此,我使用 string 和 assertEquals 对其进行了测试。以上是关于未定义的属性:Laravel 单元测试中的 Mockery_3_App_Repositories_ArticleRepositoryInterface::$id的主要内容,如果未能解决你的问题,请参考以下文章
渲染中的错误:“TypeError:无法读取未定义的属性'_t'”在使用 Jest 的单元测试中
[karma-server]:TypeError:无法读取未定义的属性“范围”-CI 环境中的 Angular 单元测试