Laravel 静态类方法的部分模拟不起作用

Laravel 静态类方法的部分模拟不起作用,laravel,phpunit,mockery,php-7.0,Laravel,Phpunit,Mockery,Php 7.0,我试图在一个类上模拟一个静态方法。但是,如果我调用mock方法,就不会再找到类变量。似乎整个类都被模拟,而makePartial()被忽略 我在一个空白的laravel项目中创建了一个错误案例。以下是相关代码: 另一个控制器: namespace App\Http\Controllers; class AnotherController extends Controller { public function coolMethod() { logger(Stat

我试图在一个类上模拟一个静态方法。但是,如果我调用mock方法,就不会再找到类变量。似乎整个类都被模拟,而
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;
静态控制器
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;
示例测试
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;
使用Tests\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());
    }
}
输出:

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;
[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
即使在原始类上定义,也无法再找到它


非常感谢您的帮助

事实证明,不可能将
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.

可以找到文档

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