Имитация общедоступного метода тестирования объекта

У меня есть класс с двумя общедоступными методами. Это выглядит примерно так:

class IntRequest
{
    public function updateStatus()
    {
        $isValid = $this->checkValidity();

        // ... next is a complex logic that use $isValid
    }

    /**
     * @return bool
     */
    public function isValid()
    {
        // another complex logic
    }
}

Мне нужно протестировать первую функцию - IntRequesr::updateStatus; однако мне нужно бежать к тестам. Первый с IntRequests::isValid возвращает false, а второй с true в результате IntRequests::isValid

Я пытаюсь издеваться над этой функцией, но тесты выполняются с вызовом фактического IntRequests::isValid, а не издевательского.

Мой тестовый код

$intRequest = new IntRequests;

$mock = m::mock($intRequest);
$mock->shouldReceive('isValid')
    ->once()
    ->andReturn(true);

$res = $mock->updateStatus();

$this->assertTrue($res);

Я пытался позвонить $res = $intRequest->updateStatus() вместо $res = $mock->updateStatus(), но безуспешно.

Итак, мне интересно, можно ли издеваться над функцией, которая вызывается внутри метода тестирования?


person vansanblch    schedule 27.12.2014    source источник


Ответы (1)


Вам нужен частичный макет (фиктивный объект, в котором некоторые методы заглушены, а остальные оставлены как есть). Поскольку я сделал это только с собственной фиктивной библиотекой phpunit, я могу только указать вам на документацию, но кажется, что вы должны просто добавить ->makePartial() к вашему фиктивному экземпляру.

person Maxim Krizhanovsky    schedule 27.12.2014