【问题标题】:Laravel phpunit testing controller which returns view with dataLaravel phpunit 测试控制器,它返回带有数据的视图
【发布时间】: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>

【问题讨论】:

    标签: laravel tdd phpunit


    【解决方案1】:

    'positions.open.index' 内,它试图访问非对象上的id 属性。

    这可能是因为您的$query 没有返回任何Position 对象(即$data-&gt;positions 返回一个空的Collection

    运行单元测试时,它很可能正在创建一个临时数据库(默认为sqlite),该数据库不会填充任何数据。尝试在您的测试中添加一些Positions,如下所示:

    /** @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 类型的对象上获得 -&gt;id 属性?
    猜你喜欢
    • 1970-01-01
    • 2015-05-07
    • 2016-01-31
    • 2020-12-09
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多