【问题标题】:Partial mocking of static class methods not working静态类方法的部分模拟不起作用
【发布时间】:2019-03-02 11:14:47
【问题描述】:

我试图在一个类上模拟一个静态方法。但是,如果我调用模拟方法,则不再找到类变量。似乎整个班级都被嘲笑了,makePartial() 被忽略了。

我在一个空白的 laravel 项目中创建了一个错误案例。以下是相关代码:

另一个控制器:

namespace App\Http\Controllers;

class AnotherController extends Controller
{
    public function coolMethod()
    {
        logger(StaticController::$staticArray);
        logger(StaticController::staticMethod('arg1'));
    }
}

静态控制器

namespace App\Http\Controllers;

class StaticController extends Controller
{
    public static $staticArray = [
        'foo',
        'bar'
    ];

    public static function staticMethod($arg1, $arg2 = [])
    {
        logger("The real static method");
        logger(self::$staticArray);
    }
}

示例测试

namespace Tests\Feature;

use App\Http\Controllers\AnotherController;
use App\Http\Controllers\StaticController;

使用测试\TestCase;

class ExampleTest extends TestCase
{
    public function testStaticMock()
    {
        $mock = \Mockery::mock('alias:App\Http\Controllers\StaticController');
        $mock
            ->makePartial()
            ->shouldReceive('staticMethod')
            ->withAnyArgs()
            ->andReturn("I'm the mocked return");

        $anotherController = new AnotherController();
        logger($anotherController->coolMethod());

        logger(StaticController::staticMethod());
    }
}

输出:

[16:01:24] user@shell [~/Development/Code/Laravel] $ vendor/phpunit/phpunit/phpunit -v
PHPUnit 6.5.13 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.14 with Xdebug 2.6.0
Configuration: /Users/.../Development/Code/Laravel/phpunit.xml

E                                                                   1 / 1 (100%)

Time: 183 ms, Memory: 12.00MB

There was 1 error:

1) Tests\Feature\ExampleTest::testStaticMock
Error: Access to undeclared static property: App\Http\Controllers\StaticController::$staticArray

/Users/.../Development/Code/Laravel/app/Http/Controllers/AnotherController.php:9
/Users/.../Development/Code/Laravel/tests/Feature/ExampleTest.php:22

ERRORS!
Tests: 1, Assertions: 1, Errors: 1.

如你所见,$staticArray 已经找不到了,即使它是在原始类中定义的。

非常感谢任何帮助!

【问题讨论】:

  • 您可能需要static:: 而不是self:: ?
  • 这不是问题,我更新了问题以更好地反映问题。
  • 从文档link 看来,实际使用模拟别名只会创建一个新的 stdClass 对象来替换您将要使用的静态类。在您的情况下,别名模拟从未在其上声明过 $staticArray,因此出现错误。尝试在 $mock 上设置 $staticArray 以避免出现错误。所以在创建 $mock 之后尝试添加一行 $mock::$staticArray = ['foo', 'bar'];

标签: laravel phpunit mockery php-7.0


【解决方案1】:

事实证明,不能将makePartial() 与别名模拟一起使用。那是因为类被完全替换了:

Prefixing the valid name of a class (which is NOT currently loaded) with “alias:”
will generate an “alias mock”. Alias mocks create a class alias with the given classname
to stdClass and are generally used to enable the mocking of public static methods.
Expectations set on the new mock object which refer to static methods will be used
by all static calls to this class.

文档可以在here找到

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多