Издевательский макет и шпион вызывали 0 раз на пользовательском классе в контроллере - PullRequest
1 голос
/ 28 апреля 2020

У меня возникают проблемы с шпионом и макетом в тесте Laravel 7, когда я тестирую MyCustomClass.

Я пробовал оба макета перед запуском $ this-> get и шпионом после $ this-> получить. Оба с одним и тем же сообщением об ошибке (* ниже).

При запуске отладки в контроллере $ myCustomClass по-прежнему является MyCustomClass, а не смоделированным объектом.

MyCustomClass

class MyCustomClass
{
 public function execute()
 {
   return 'hello';
 }

MyController

class MyController
{
 public function show()
 {
   $myCustomClass = new MyCustomClass();

   $data = $myCustomClass->execute();

   return $data;
 }


private $mySpy;

public function testAMethod()
    {
        $spy = $this->spy(MyCustomClass::class); 

        $response = $this->get('/my/path');

        $spy->shouldHaveReceived('execute');

        $response->assertStatus(200);
    }

Ошибка

Method execute(<Any Arguments>) from Mockery_2_App_MyCustomClass should be called
 at least 1 times but called 0 times.

1 Ответ

1 голос
/ 28 апреля 2020

Проблема в том, что вы сами создаете MyCustomClass с помощью ключевого слова new.

Чтобы Laravel мог поменять действительный класс со шпионом, вы должны использовать служебный контейнер .

Примерно так:

class MyController
{
    public function show(MyCustomClass $myCustomClass)
    {
        return $myCustomClass->execute();
    }
}
...