Я пытаюсь издеваться над одним статическим методом класса. Однако, если я вызываю имитацию метода, переменные класса больше не обнаруживаются. Похоже, что весь класс издевается, а 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 больше не может быть найден, даже если он определен в исходном классе.
Любая помощь высоко ценится!
Проблема не в этом, я обновил вопрос, чтобы лучше отразить проблему.
Из документации ссылка кажется, что использование фактического псевдонима просто создает новый объект stdClass, который заменяет статический класс, который вы собирались использовать. В вашем случае псевдоним псевдонима никогда не объявлял $ staticArray, отсюда и ошибка. Попробуйте установить $ staticArray в свой $ mock, чтобы избежать ошибки, которую вы получаете. Поэтому после создания $ mock попробуйте добавить строку вида $ mock :: $ staticArray = ['foo', 'bar'];






Как оказалось, использовать 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::?