Долго бьюсь с одной проблемой при создании теста. Может кто поопытней подскажет что я не так делаю. Смысл в следующем. Есть несколько связанных классов:
abstract class ApiRequest
{
// объявление переменных
function __construct($profileID = false)
{
echo "Real ApiRequest::__construct" . PHP_EOL;
// какой-то код
return;
}
protected function query($type, $path, $data = null, $task = false, $stop_repeating = null)
{
// какой-то код отправки запроса
}
// другие методы
abstract public function send();
}
class setHidden extends ApiRequest
{
public function send($offers = [])
{
echo "Real setHidden::send" . PHP_EOL;
// какой-то код
return null; //$this->query("POST", $this->url . $path, $data);
}
}
class HS implements TaskInterface
{
public function execute($arTask): void
{
// какой-то код
$o = new setHidden();
$res = $o->send($arBody); var_dump($res);
// какой-то код
}
}
Для класса HS пишу тест:
/**
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
class HSTest extends BitrixTestCase
{
// объявление переменных
public function setUp(): void
{
parent::setUp();
$this->apiRequestMock = $this->getMockBuilder(\Iplogic\Beru\V2\ApiRequest\setHidden::class)
->disableOriginalConstructor()
->getMock();
// какой-то код (другие заглушки)
}
/**
* @doesNotPerformAssertions
*/
public function testExecute(): void
{
// какой-то код
$this->apiRequestMock->expects($this->once())
->method('send')
->with($this->equalTo([
"hiddenOffers" => [
[
"marketSku" => 3,
"comment" => "",
"ttlInHours" => 720,
],
[
"marketSku" => 4,
"comment" => "",
"ttlInHours" => 720,
],
],
]))
->willReturn(["status" => 200]);
$obj = new HS();
$obj->execute(["ID" => 111]);
}
}
Все заглушки я не привожу, там всё нормально. А вот с методом setHidden::send проблема. Его надо эмулировать, но...
Результат выполнения теста такой:
HSTest
x execute [0.019s]
Real ApiRequest::__construct
Real setHidden::send
NULL
Time: 00:00.229, Memory: 28.00 MB
There was 1 failure:
1) HSTest::testExecute
Expectation failed for method name is "send" when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Script phpunit handling the test event returned with error code 1
То есть выполняются реальные методы вместо заглушек, а метод заглушку он не трогает и считает что он не вызывался.
Пробовал частичный мок - то же самое.
Что делаю не так?