Частичное издевательство над методами статического класса не работает

Я пытаюсь издеваться над одним статическим методом класса. Однако, если я вызываю имитацию метода, переменные класса больше не обнаруживаются. Похоже, что весь класс издевается, а makePartial() игнорируется.

Я создал случай ошибки в пустом проекте laravel. Вот соответствующий код:

Другой Контроллер:

namespace App\Http\Controllers;

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

StaticController

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());
    }
}

Выход:

[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::?

Evert 26.09.2018 17:52

Проблема не в этом, я обновил вопрос, чтобы лучше отразить проблему.

Daniel Becker 27.09.2018 11:37

Из документации ссылка кажется, что использование фактического псевдонима просто создает новый объект stdClass, который заменяет статический класс, который вы собирались использовать. В вашем случае псевдоним псевдонима никогда не объявлял $ staticArray, отсюда и ошибка. Попробуйте установить $ staticArray в свой $ mock, чтобы избежать ошибки, которую вы получаете. Поэтому после создания $ mock попробуйте добавить строку вида $ mock :: $ staticArray = ['foo', 'bar'];

grizzb 09.10.2018 19:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
3
1 530
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Документацию можно найти здесь

Другие вопросы по теме