【问题标题】:How to debug Mockery\Exception\InvalidCountException?如何调试 Mockery\Exception\InvalidCountException?
【发布时间】:2018-08-02 09:34:16
【问题描述】:

我的单元测试文件中有这一行:

$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

如何调试以查看在测试期间调用该方法的参数是什么?

【问题讨论】:

    标签: php exception mockery


    【解决方案1】:

    我发现的解决方法涉及修改Mock.php 中的_call()/_callStatic


    例如,我编辑了文件: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);
    }
    

    这里是不那么分散注意力的日志行(可以处理circular references):

    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')));
    

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 2019-04-21
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2013-09-08
      • 2010-11-07
      • 2012-05-17
      相关资源
      最近更新 更多