如何在 Laravel 中断言分页?

我有一个具有以下方法的类别模型:


public static function index()

{

    return self::has('posts')->paginate(1);

}

我的类别控制器:


public function index()

{

    $categories = Category::index();

    return view('categories.index', compact('categories'));

}

这是我尝试过的,我正在使用 RefreshDatabase 特征。


public function test_index_view_is_working()

{

    factory(Post::class, 5)->create();

    $response = $this->get(route('categories.index'));

    $response->assertViewHas('categories', Category::index());

}

该测试由于某种原因失败:


Failed asserting that two objects are equal.


at tests/Feature/CategoryTest.php:38

    37|         $response->assertViewIs('categories.index');

  > 38|         $response->assertViewHas('categories', Category::index());


--- Expected

+++ Actual

@@ @@

                 'dispatchesEvents' => Array ()

                 'observables' => Array ()

                 'relations' => Array (

+                    'posts' => Illuminate\Database\Eloquent\Collection Object (...)

                 )

                 'touches' => Array ()

                 'timestamps' => true


POPMUISE
浏览 111回答 2
2回答

白板的微信

出现此错误的原因是因为不知何故posts急切地从视图/控制器加载,而不是从测试加载。我猜return self::has('posts')->with('posts')->paginate(1);可以修复它。或者,您可以测试页面底部是否有分页。因为{{ $categories->links() }}会添加类似的东西Previous,Next你仍然可以寻找它。$response = $this->get(route('categories.index'));$response->assertSee('Next');此外,您可以确保对类别进行分页,但不能确保您已在页面底部添加链接。use Illuminate\Contracts\Pagination\Paginator;...$response = $this->get(route('categories.index'));$this->assertInstanceOf(Paginator::class, $response->viewData('categories'));

慕尼黑的夜晚无繁华

setUp您是否在测试方法中运行任何迁移/工厂?看起来您的数据库中可能没有帖子记录,因此$categories进入视图时为null。另请注意,如果您只想确保视图具有$categories可以使用的变量$response->assertViewHas('categories');。如果您想确保视图获取实际数据,这并不理想。
打开App,查看更多内容
随时随地看视频慕课网APP