0

我尝试模拟我的 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。

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

4

1 回答 1

0

我最终编写了一个集成(功能)测试,它调用了 artisan 命令,并将功能移动到单独的类中,这些类可以更容易地用 PHPUnit 进行测试$this->artisan('command' [/*...args*/])

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

于 2019-11-14T11:02:07.713 回答