我尝试模拟我的 laravel 控制台命令以进行 PHPUnit 测试。作为构造函数参数,它需要一个 laravel 配置存储库的实例:
<?php
class AmazingCommandTest extends TestCase
{
public function test_something_to_be_working()
{
$mock = $this->getMockBuilder(AmazingCommand::class)
->setConstructorArgs([
$this->app->make(Repository::class),
$this->app->make(ConnectionInterface::class)
])
->getMock();
// ... to be continued. Error appears already here
}
}
我的控制台命令的相应构造函数如下所示:(其中Repository
类型为Illuminate\Config\Repository
)
/**
* @param Repository $config
* @param ConnectionInterface $db
*
* @throws \Doctrine\DBAL\DBALException
*/
public function __construct(Repository $config, ConnectionInterface $db)
{
$this->db = $db;
$this->schemaManager = $db->getDoctrineSchemaManager();
$this->schemaManager->getDatabasePlatform()->registerDoctrineTypeMapping('enum', 'string');
$this->config = $config;
parent::__construct();
}
因此,如果我现在运行单元测试,我会收到此错误:
1) Tests\Unit\Commands\ AmazingCommandTest::test_something_to_be_working 错误:在 null 上调用成员函数 addArguments()
/Users/xyz/Projects/packages/amazingpackage/foobar/vendor/laravel/framework/src/Illuminate/Console/Command.php:144
这指向方法中的一行protected function configureUsingFluentDefinition() {}
:
$this->getDefinition()->addArguments($arguments);
其中 getDefinition() 返回一个 InputDefinition:
Symfony\Component\Console\Input\InputDefinition {#3167
-arguments: []
-requiredCount: 0
-hasAnArrayArgument: false
-hasOptional: false
-options: []
-shortcuts: []
}
getDefinition()
只检查是否$this->definition
已定义,如果没有则抛出 LogicException。
那么,我在这里做错了什么?有什么我可能想念的吗?