Laravel phpunit 测试控制器,它返回带有数据的视图
Posted
技术标签:
【中文标题】Laravel phpunit 测试控制器,它返回带有数据的视图【英文标题】:Laravel phpunit testing controller which returns view with data 【发布时间】:2020-05-07 12:44:06 【问题描述】:我正在尝试在 laravel 上调整 TDD,但是在测试控制器时遇到了麻烦,该控制器查询记录集合并在我运行测试时返回带有数据的视图,它返回一条错误消息,试图获取未定义属性的 id
// 我的测试
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class JobApplicationTest extends TestCase
use WithoutMiddleware;
/** @test */
public function user_can_see_all_open_positions()
// when user visit apply for a job page
$this->withoutExceptionHandling();
$response = $this->get(route('positions.open'));
$response->assertSuccessful();
$response->assertViewIs('positions.open.index');
$response->assertViewHas('positions');
// My controller
public function open(Request $request)
//TODO support additional filters & searches
//initialize query
$query = Position::query()->which()->are()->open();
//paginate query result
$positions = $query->paginate(config('app.defaults.pageSize'));
$data = [
'route_title' => 'Open Job Positions',
'route_description' => 'Available Job Positions',
'positions' => $positions,
];
return view('positions.open.index', $data);
所以问题是当我运行文本时,它看起来返回的视图没有数据,而视图引用数据返回到控制器
运行测试时的错误消息
1) 测试\Unit\JobApplicationTest::user_can_see_all_open_positions ErrorException:试图获取非对象的属性“id”(查看: /var/www/html/ipf-projects/niajiri/resources/views/pos itions/open/index.blade.php)
<h3>
<a href=" route('positions.preview', [
'id' => $position->id,
'slug' => str_slug($position->title)
]) " class="text-navy">
!! $position->title !! - !! $position->organization->name !!
</a>
</h3>
【问题讨论】:
【参考方案1】:在'positions.open.index'
内,它试图访问非对象上的id
属性。
这可能是因为您的$query
没有返回任何Position
对象(即$data->positions
返回一个空的Collection
)
运行单元测试时,它很可能正在创建一个临时数据库(默认为sqlite
),该数据库不会填充任何数据。尝试在您的测试中添加一些Position
s,如下所示:
/** @test */
public function user_can_see_all_open_positions()
// Create Positions
Position::create([/* Some data here */]);
Position::create([/* Some data here */]);
// when user visit apply for a job page
$this->withoutExceptionHandling();
$response = $this->get(route('positions.open'));
$response->assertSuccessful();
$response->assertViewIs('positions.open.index');
$response->assertViewHas('positions');
【讨论】:
我使用工厂创建了一个位置,并将位置创建到数据库,但问题仍然是控制器返回视图需要数据的视图,并且在我的测试中我无法获取返回到控制器的数据集合$position = factory(Position::class)->create(); 可以发positions.open.index
的内容吗?是否有任何实例可以让您在不属于 Position
类型的对象上获得 ->id
属性?
!!$position->title!! - !!$position->organization->name!!
跨度>以上是关于Laravel phpunit 测试控制器,它返回带有数据的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel PHPUnit 测试中获取响应变量?
处理来自 PHPUnit (Laravel 5.2) 的自定义异常