Я хотел бы спросить вас о вашей практике написания модульных тестов, как смоделировать объект и не повторять код?
Я использую платформу Symfony2 и, например, у меня есть много пакетов с пользовательскими валидаторами. Когда я и остальная часть моей команды пишем юнит-тест, мы повторяем код насмешливых Constraint, ExecutionContext, ConstraintViolationBuilderInterface. Я знаю, что мы можем создать специальный или абстрактный класс или что-то еще, где мы можем хранить код, ответственный за макет, но прежде чем я начну это делать, мне бы хотелось узнать ваши лучшие практики.
Моей первой идеей было создать класс / черту, которая будет хранить, например, макет всех репозиториев. Пример:
class MockRepositoryHelper extends \PHPUnit_Framework_TestCase
{
public function getUserRepositoryMock()
{
return $this->prophesize(UserRepository::class);
}
// next repositories getters
}
а затем использовать этот код в реальном тестовом примере:
class EmailValidator extends \PHPUnit_Framework_TestCase
{
private $mockRepositoryHelper;
public function setUp()
{
parent::setUp();
$this->mockRepositoryHelper = new MockRepositoryHelper();
}
/**
* @test
*/
public function it_should_find_user()
{
$userRepository = $this->mockRepositoryHelper->getUserReposioryMock();
$userRepository->findUser(Argument::type('string'))->willReturn(null);
// rest of the test
}
}
Конечно, это только псевдокод, о котором я думал, моя первая мысль. Какие у тебя идеи?
В основном я спрашиваю, как написать модульный тест быстрее и не повторять код?
Задача ещё не решена.
Других решений пока нет …