Метод перегрузки работает, перехватывая механизм autoload
: он регистрирует автозагрузчик для класса overloaded
, загружая макетированную версию класса вместо оригинала.По умолчанию, он не добавляет много вещей в проверяемый класс.Однако вы можете настроить практически все, что вам может понадобиться.
Обычно , реализующий один или несколько интерфейсов , можно сделать, указав разделенный запятыми список полностью определенных имен, первое из которыхбудучи классом:
$mock = Mockery::mock('MyClass, MyInterface, OtherInterface');
Из-за способа установки метода Mockery::mock
это не будет работать.( Автор приносит свои извинения в исходном коде )
Однако мы можем передать интерфейс (ы) в качестве второго аргумента методу-методу:
Mockery::mock('overload:'.CurrencyEnum::class, BaseCurrency::class);
Это будетзаставить MockConfigurationBuilder
добавить BaseCurrency
в качестве цели;так как это интерфейс, он заставит макет реализовывать интерфейс.
Альтернативным обозначением вышеизложенного было бы непосредственное использование компоновщика:
Mockery::mock(
(new MockConfigurationBuilder())
->setInstanceMock(true)
->setName(CurrencyEnum::class)
->addTarget('stdClass')
->addTarget(BaseCurrency::class)
)
Сказав, что это, как известно, плохопрактиковаться, чтобы высмеивать такие вещи, как перечисления и объекты значения.Почему бы просто не использовать фактический CurrencyEnum
?Что-то такое простое, как код валюты, не совсем оправдывает насмешки.Вероятно, есть структурное улучшение, которое одновременно добавит тонны ценности к вашим тестам и сделает их проще для чтения.