2017-02-10 2 views
1

Нужно немного помочь с помощью Mockery - я хочу перегрузить класс, который создается с помощью метода new HelperUtil() в методе.Недостающие методы перегрузки смешения

Использование Mockery overload Я могу это сделать, но он оставляет меня с пустым классом оболочки. Кажется, что мне нужно создать все методы, которые вызывают. Есть ли способ создать перегруженный полный макет, а затем изменить только один метод?

$mock = \Mockery::mock('overload:'.HelperUtil::class); 
    $mock->shouldReceive('content')->andReturnUsing(function() { 
     return 'different content'; 
    }); 

благодаря

редактировать: Я думаю, что я хочу сделать:

$mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldDeferMissing(); 
    $mock->shouldReceive('content')->andReturnUsing(function() { 
     return 'different content'; 
    }); 

Но это еще dosnt работу = (

ответ

1

Существует interesting discussion об этом на GitHub

shouldIgnoreMissing и shouldDeferMissing (и другие такие флаги настоящее и будущее) делают работу, но не на макет, а на экземпляре макет.

Звучит непонятно, но это из-за внутренних элементов.

Когда вы делаете m::mock('overload:Foo'); издевательство идет и создает новый класс под названием Foo на основе «шаблона» Mock.php. И этот шаблон имеет флаг _mockery_ignoreMissing, установленный как false по умолчанию.

Как только метод макета доходит до конца, он создает перегруженный объект Foo и возвращает его нам. Перегруженный класс Foo также является доступным для создания новых объектов Foo.

Вызов $m->shouldIgnoreMissing() устанавливает нулевой флаг игнорирования объекта , который был возвращен методом макета.

Вызов new Foo() создает новый экземпляр Foo объекта, который имеет в Mock.php шаблоны по умолчанию для ложных _mockery_ignoreMissing.

Если вы хотите, чтобы флаг установлен на true в новом экземпляре, вы должны вызвать shouldIgnoreMissing() на этом экземпляре, а не на $m.

Как я вижу, функция «should ignore missing on instance mocks» была завершена, так что лучшее, что вы можете сделать, это

$mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldIgnoreMissing(); 

Я не вижу shouldDeferMissing было сделано еще в overload.

Конечно, в качестве обходного пути вы можете подумать о создании макета и инъекции его.

Смежные вопросы