I have a category model with the following method:
public static function index() { return self::has('posts')->paginate(1); }
My category controller:
public function index() { $categories = Category::index(); return view('categories.index', compact('categories')); }
This is what I’ve tried, I am using RefreshDatabase trait.
public function test_index_view_is_working() { factory(Post::class, 5)->create(); $response = $this->get(route('categories.index')); $response->assertViewHas('categories', Category::index()); }
This test fails for some reason:
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' => IlluminateDatabaseEloquentCollection Object (...) ) 'touches' => Array () 'timestamps' => true
Advertisement
Answer
The reason you get this error is because somehow the posts
are eager loaded from the view/controller but not from the tests.
I’m guessing return self::has('posts')->with('posts')->paginate(1);
could fix it.
Alternatively, you can test if you have the pagination at the bottom the page. Since {{ $categories->links() }}
will add something like Previous
and Next
you can still look for it.
$response = $this->get(route('categories.index')); $response->assertSee('Next');
Also, you can ensure that you paginate the categories but it won’t ensure you have added the links at the bottom of the page.
use IlluminateContractsPaginationPaginator; ... $response = $this->get(route('categories.index')); $this->assertInstanceOf(Paginator::class, $response->viewData('categories'));