Как отлаживать Mockery\Exception\InvalidCountException?

У меня есть эта строка в моих файлах модульного тестирования:

$this->object->drupal->shouldReceive('drupalSetMessage')->once();

но у меня есть такие ошибки, как:

$ ./tests/phpunit -c tests/phpunit.xml

...

There was 1 error:

1) SessionTest::testFoo
Mockery\Exception\InvalidCountException: Method drupalSetMessage(<Any Arguments>) from Mockery_1_Drupal_Util_Drupal should be called
 exactly 1 times but called 0 times.

tests/vendor/mockery/mockery/library/Mockery/CountValidator/Exact.php:38
tests/vendor/mockery/mockery/library/Mockery/Expectation.php:309
tests/vendor/mockery/mockery/library/Mockery/ExpectationDirector.php:119
tests/vendor/mockery/mockery/library/Mockery/Container.php:301
tests/vendor/mockery/mockery/library/Mockery/Container.php:286
tests/vendor/mockery/mockery/library/Mockery.php:165

Как я могу отладить, чтобы увидеть, с какими параметрами метод был вызван во время теста?


person kenorb    schedule 22.02.2018    source источник


Ответы (1)


Обходной путь, который я нашел, включает изменение _call()/_callStatic в файле Mock.php.


Например, я отредактировал файл: vendor/mockery/mockery/library/Mockery/Mock.php.

Затем я добавил строку:

if ($method == 'drupalSetMessage') var_dump($method . " " . var_export($args, TRUE));

Итак, функции выглядят так:

public function __call($method, array $args)
{
    if ($method == 'drupalSetMessage') var_dump($method . " " . var_export($args, TRUE));
    return $this->_mockery_handleMethodCall($method, $args);
}

public static function __callStatic($method, array $args)
{
    if ($method == 'someStaticMethodName') var_dump($method, $args);
    return self::_mockery_handleStaticMethodCall($method, $args);
}

А вот менее отвлекающая строка ведения журнала (которая может обрабатывать циклические ссылки):

syslog(LOG_DEBUG, sprintf("%s: %s(%s)", __METHOD__, $method, json_encode($args, TRUE)));

Затем вывод можно найти в системном журнале. В macOS поток журнала можно отобразить с помощью следующей команды:

log stream --level debug --predicate 'processImagePath contains "php"

Чтобы распечатать список функций, в которых это происходит (обратная трассировка), может быть полезна эта строка:

printf("%s(%s) at %s\n", $method, json_encode($args, TRUE), implode(', ', array_column(debug_backtrace(), 'function')));
person kenorb    schedule 22.02.2018