Как я могу перезаписать в тесте конкретные реализации, помеченные Laravel Service Container? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть один интерфейс, который пока имеет один реализующий класс. В сервисном контейнере Laravel я пометил этот конкретный класс относительно интерфейса.

    public function register()
    {
        $this->app->tag([
            ConcreteClassA::class,
        ], Interface::class);
    }

Я хотел бы полностью перезаписать этот тег с помощью имитации расширения этого интерфейса. Я пробовал следующее:

$mock = $this->mock(Interface::class, function (MockInterface $mock) {
            $mock->shouldReceive('someMethod')
                ->andReturn(Carbon::now());
        });

app()->tag([$mock], Interface::class);

Я также использовал различные варианты binding() и instance() без удачи.

1 Ответ

0 голосов
/ 12 апреля 2020

Я предлагаю использовать instance ().

$this->app->instance(Interface::class, Mockery::mock(Interface::class, function($mock){
            $mock->shouldReceive("someMethod")->andReturn(Carbon::now());
        }));

$mocked = $this->app->make(Interface::class);
$mocked->someMethod()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...