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

标签 laravel phpunit mockery php-7.0

我正在尝试模拟类上的单个静态方法。但是,如果我调用模拟方法,则不再找到类变量。看起来整个类都被模拟了,并且 makePartial() 被忽略了。

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

另一个 Controller :

namespace App\Http\Controllers;

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

静态 Controller

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 是在原始类中定义的,也无法再找到它。

非常感谢任何帮助!

最佳答案

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

关于laravel - 静态类方法的部分模拟不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52521741/

相关文章:

php - Laravel 检索多行数据

php - 在不相关的类中进行静态方法调用的替代方法是什么?

php - 防止在测试期间将 error_log() 消息打印到终端

laravel - 如何在 Laravel 中模拟 Job 对象?

php - 测试 Controller 时忽略 Laravel 5.1 mock 期望

javascript - Document.getElementById(...) 在 Laravel View 中为 Null

laravel cron 没有触发,但其他 cron 正在触发

php - 如何模拟 Laravel Eloquent 访问器属性

unit-testing - 使用 Mockery 测试 Laravel Controller 时出现问题 |试图获取非对象的属性

php - 使用 Eloquent 选择具有值的最后一条记录