@igor1112

Как в тесте сделать мок собственного класса-сервиса?

У меня есть контроллер -
class PostController extends Controller
{
    private $postindexer;

    public function __construct(PostIndexer $postindexer)
    {
        $this->postindexer = $postindexer;
    }

    public function store(Request $request)
    {
        $post = new Post;
        $post->name = $request->name;
        $post->save();

        $this->postindexer->index($post);

        return response()->json($post, 201);
    }
}

В конструктуре этого контроллера внедряется мой класс-сервис "PostIndexer", который после создания поста заносит в индекс elastisearch этот новый, только что созданный пост.

Для тестирования контроллера я использую функциональный тест - захожу просто по адресу, проверяю базу, смотрю код ответа. При этом мне ненужно, чтобы заносился в индекс elasticsearch этот новый пост.

Тестовые метод выглядит следующим образом -
public function testStore()
{
    $params = [ 'title' => 'New Post', 'body' => "I'm a content"];

    $this->post('/admin/posts', $params)->assertStatus(201);

    $post = Post::first()->toArray();

    $this->assertDatabaseHas('posts', $post);
}

Вопрос - как мне сделать так, чтобы эта строка кода в классе "PostController" при тестовом post-запросе не срабатывала -
$this->postindexer->index($post);

Как нужно мокнуть эту штуку, чтобы она не вызывалась?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
https://laravel.com/docs/5.8/mocking#mocking-objects

$this->mock(PostIndexer::class, function ($mock) {
    $mock->shouldReceive('index')->once();
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы