【问题标题】:Call to a member function addArguments() on null在 null 上调用成员函数 addArguments()
【发布时间】:2020-03-10 06:38:01
【问题描述】:

我尝试模拟我的 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) 测试\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-&gt;getDefinition()-&gt;addArguments($arguments); 其中 getDefinition() 返回一个 InputDefinition:

Symfony\Component\Console\Input\InputDefinition {#3167
  -arguments: []
  -requiredCount: 0
  -hasAnArrayArgument: false
  -hasOptional: false
  -options: []
  -shortcuts: []
}

getDefinition() 只检查$this-&gt;definition 是否已定义,如果没有则抛出 LogicException。

那么,我在这里做错了什么?有什么我可能想念的吗?

【问题讨论】:

  • 无论出于何种原因,getDefinition() 返回 NULL。你需要找出原因

标签: php laravel symfony phpunit symfony-console


【解决方案1】:

我最终编写了一个集成(功能)测试,它通过 $this-&gt;artisan('command' [/*...args*/]) 而不是 调用 artisan 命令,并且 移动 功能以分离可以使用 PHPUnit 测试的类更容易。

但我不接受这是一个有效的答案,因为它只是一种解决方法。我认为可能存在错误或者我真的错过了一些东西。

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 2017-09-24
    • 2018-02-06
    • 2018-09-29
    • 2018-08-04
    • 2020-03-28
    • 2020-10-28
    • 2020-09-01
    • 2023-03-14
    相关资源
    最近更新 更多