Тестирование Laravel View Composers с помощью Mockery

Я пытаюсь протестировать свои View Composers. Всякий раз, когда я передаю объект $view->with('string', $object), мой тест терпит неудачу. Это когда я делаю тест следующим образом:

$view
    ->shouldReceive('with')
    ->with('favorites', $this->user->favorites(Ad::class)->get())
    ->once();

Я почти уверен, что это из-за строгой проверки. Итак, я осмотрелся и увидел эту проблему. Тем не менее, я не могу заставить его работать. Закрытие возвращает true, но тест не проходит:

Mockery\Exception\InvalidCountException : метод with('favorites', ‹ Closure===true >) из Mockery

public function it_passes_favorites_to_the_view()
{
    $this->setUpUser(); // basically sets $this->user to a User object

    Auth::shouldReceive('user')
        ->once()
        ->andReturn($this->user);

    $composer = new FavoritesComposer();

    $view = Mockery::spy(View::class);

    $view
        ->shouldReceive('with')
        ->with('favorites', Mockery::on(function($arg) {
            $this->assertEquals($this->user->favorites(Ad::class)->get(), $arg);
        }))
        ->once();

    $composer->compose($view);
}
Illuminate_View_View должен вызываться ровно 1 раз, но вызываться 0 раз.

Вот мой текущий тест

public function it_passes_favorites_to_the_view()
{
    $this->setUpUser(); // basically sets $this->user to a User object

    Auth::shouldReceive('user')
        ->once()
        ->andReturn($this->user);

    $composer = new FavoritesComposer();

    $view = Mockery::spy(View::class);

    $view
        ->shouldReceive('with')
        ->with('favorites', Mockery::on(function($arg) {
            $this->assertEquals($this->user->favorites(Ad::class)->get(), $arg);
        }))
        ->once();

    $composer->compose($view);
}

Класс FavoritesComposer:

public function compose(View $view)
{
    $user = Auth::user();

    $favorites = $user 
        ? $user->favorites(Ad::class)->get()
        : collect([]);

    $view->with('favorites', $favorites);
}

Как мне протестировать такой объект?


person Fredrik    schedule 12.11.2018    source источник


Ответы (1)


Я исправил проблему, заменив $view->with('favorites', $favorites); на $view->with(['favorites' => $favorites]);, а затем протестировав ее следующим образом:

$view
    ->shouldReceive('with')
    ->with(['favorites' => $this->user->favorites(Ad::class)->get()])
    ->once();

Таким образом, использование только одного параметра в методе with() - это то, что исправило это для меня.

person Fredrik    schedule 12.11.2018