【发布时间】: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