Насмешка должна получить, но метод не существует

Я пытаюсь немного больше понять тесты и насмешки с Laravel. У меня есть настройка шаблона репозитория, которую используют мои пользователи контроллера. Я хочу протестировать свой основной getAllUsers()метод:

public function test_get_all_users_method()
{
    $repo = Mockery::mock('Acme\Repositories\User\UserRepository');
    $repo->shouldReceive('all')->once()->andReturn('foo');

    $controller = new Acme\Controllers\Api\UserController($repo);
    $response = $controller->getComponents();

    $this->assertEquals('foo', $response);
}

Насколько я понимаю, я издеваюсь над своим UserRepository и ожидаю, что у моего UserRepository будет хит метода all(). Это возвращает некоторые фиктивные данные, и я ожидаю увидеть это в своем ответе.

Так что работает нормально. Метод all() существует в моей реализации репозитория Eloquent. Однако, если я удалю метод all(), тест все равно пройдет... С чего бы это? Конечно, тест должен провалиться.

Если это нормально, я изо всех сил пытаюсь понять, почему я должен тестировать свой контроллер таким образом, поскольку я могу передать ему любое старое имя метода, даже если оно существует или нет.

Ваше здоровье


person Alias    schedule 27.11.2014    source источник


Ответы (1)


Вот как mockery работает по умолчанию, мне это нравится, потому что это позволяет мне развиваться, выдавая желаемое за действительное, т.е. я хочу, чтобы мой UserRepository интерфейс имел all метод.

Вы можете сказать mockery запретить его, хотя это немного уродливо, но вы можете поместить это в свой тестовый файл начальной загрузки:

\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);

Вы также можете настроить это, чтобы управлять им с помощью переменной среды или чего-то еще, поэтому вы разрешаете издеваться над несуществующими методами во время обычного использования, но предотвращаете это при непрерывном запуске интеграции и т. Д.

person Dave Marshall    schedule 27.11.2014
comment
Правильно - я пытаюсь добавить тесты в существующую кодовую базу, так что в мышлении метод X требует, чтобы метод Y функционировал должным образом, поэтому имитируемый класс должен иметь этот метод. Так что ура, будем реализовывать это! - person Alias; 28.11.2014