Я пытаюсь понять Тесты и издевательства немного больше с 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()
метод, тест еще проходит … С чего бы это? Конечно, тест должен провалиться.
Если это нормально, я изо всех сил пытаюсь понять, почему я тестирую свой контроллер таким образом, поскольку я могу передать в него любое старое имя метода, даже если оно существует или нет.
ура
Вот как издевательство действует по умолчанию, мне это нравится, потому что оно позволяет мне развиваться путем желаемого мышления, т.е. UserRepository
интерфейс имел all
метод.
Вы можете сказать издевательству запретить его, хотя это немного уродливо, но вы можете поместить это в свой тестовый файл начальной загрузки:
\Mockery::getConfiguration()->allowMockingNonExistentMethods(false);
Вы также можете настроить это, чтобы управлять им с помощью переменной окружения или чего-то подобного, так что вы разрешаете имитировать несуществующие методы при обычном использовании, но не допускаете его при выполнении непрерывной интеграции и т. Д.
Других решений пока нет …