v3shin
@v3shin
Веб-шаман

Как замокать внутренние вызовы методов?

Всем привет. Есть класс с последовательными вызовами:
class MyClass
{
    public function getExternalData1($request): ExternalResponse1 { ... }
    public function getExternalData2($request): ExternalResponse2 { ... }
    public function static functionToTest($someData)
    {
        $data1 = getExternalData1($someData);
        $data2 = getExternalData2($data1->value);
        return $data2;
    }
}

Пытаюсь его замокать:
public function testFunctionToTest()
{
    $getExternalData1Value = new ExternalResponse1(['value' => 'someValue']);
    $getExternalData2Value = new ExternalResponse2();

    $myClassMock = $this->getMockBuilder(MyClass::class)
        ->disableProxyingToOriginalMethods()
        ->onlyMethods(['getExternalData1', 'getExternalData2'])
        ->getMock();

    $myClassMock->method('getExternalData1')->willReturn($getExternalData1Value);
    $myClassMock->method('getExternalData2')->willReturn($getExternalData2Value);

    $myClassMock->functionToTest([ ... ]);
}

Получаю ошибку:
[TypeError] Argument 1 passed to Mock_MyClass::getExternalData2() must be of the type string, null given, called in ...

При этом $myClassMock->getExternalData1('...')->value возвращает правильное значение 'someValue'. Как это правильно протестировать?
  • Вопрос задан
  • 242 просмотра
Решения вопроса 1
v3shin
@v3shin Автор вопроса
Веб-шаман
Всем спасибо за участие. Мой косяк: я указал functionToTest() статической. Переписал все на обычные методы - тесты заработали.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AgentSmith72
@AgentSmith72
JS - это моё хобби
Вы не передаёте аргумент в ExternalResponse2()
$getExternalData2Value = new ExternalResponse2();
И если, метод используется, только внутри класса, то нужно объявлять его как private.
private function getExternalData2($request): ExternalResponse2 { ... }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы