【问题标题】:PHPUnit Data Provider Argument Count ErrorPHPUnit 数据提供程序参数计数错误
【发布时间】:2017-05-04 07:18:17
【问题描述】:

我刚刚开始使用PHPUnit。到目前为止,除了Data Provider 问题外,一切都很顺利。

问题是当我运行测试时,它通过了。但是如果我再次运行它,它会失败并出现以下错误:

ArgumentCountError: Too few arguments to function ValidationTest::testValidateType(), 0 passed and at least 3 expected

如果我对数据提供程序函数进行任何更改(即更改要返回的数据、提供程序函数名称等)并重新运行,它会通过一次并在所有连续的测试运行中失败并出现上述错误。

我正在使用最新版本的 PHPUnit(一小时前更新)。不幸的是,我在任何地方都没有找到任何具体的解决方案。所以,我真的很担心,我是不是犯了非常愚蠢的错误?

不确定,但 PHPUnit 是否使用任何缓存机制来缓存提供程序数据?如果是,那么有什么方法可以清理它(可能使用setUp 或tearDown)?

期待看到专家的意见。提前致谢。 :-)


以下代码工作一次(通过一次):

/**
 * @covers Validation
 * @coversDefaultClass Validation
 */
class ValidationTest extends TestCase {

    protected $validation;


    protected function setUp() {
        $this->validation = new Validation();
    }


    /**
     * @covers ::validateType
     * @dataProvider validateTypeProdiver
     */
    public function testValidateType($assertion, $argument, $type) {
        $result = $this->validation->validateType($argument, $type);

        switch ($assertion) {
            case 'True':
                $this->assertTrue($result);
                break;
        }
    }


    public function validateTypeProdiver() {
        return [
            ['True', 'file.txt', 'str']
       ];
    }
}

以下代码始终有效(每次都通过):

/**
 * @covers Validation
 * @coversDefaultClass Validation
 */
class ValidationTest extends TestCase {

    protected $validation;


    protected function setUp() {
        $this->validation = new Validation();
    }


    /**
     * @covers ::validateType
     */
    public function testValidateType() {
        foreach ($this->validateTypeProdiver() as $args) {
            $result = call_user_func_array([$this->validation, 'validateType'], array_slice($args, 1));

            switch ($args[0]) {
                case 'True':
                    $this->assertTrue($result);
                    break;
            }
        }
    }


    public function validateTypeProdiver() {
        return [
            ['True', 'file.txt', 'str']
       ];
    }
}

这里是配置:

<phpunit bootstrap="vendor/autoload.php" colors="true" verbose="true" beStrictAboutTestsThatDoNotTestAnything="true">
    <testsuites>
        <testsuite name="ProjectX Unit Test">
            <directory suffix="Test.php">tests/ProjectX</directory>
            <exclude>tests/ProjectX/assets</exclude>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist>
            <directory suffix=".php">src/ProjectX</directory>
            <exclude>src/ProjectX/nodejs-commands</exclude>
        </whitelist>
    </filter>

    <php>
        <ini name="error_reporting" value="-1" />
    </php>
</phpunit>

【问题讨论】:

  • 您是否将 3 个强制参数传递给函数?另外,你能提供你的代码吗?
  • 是的,这就是它通过一次的原因。如果您调查错误消息,您会看到它显示0 passed,这意味着它没有传递任何提供的参数。 :-(
  • 我测试了你的代码,看起来工作正常。检查错误是我在其他地方。
  • 当我使用Data Provider 时,我所有的口味都发生了同样的事情。否则他们工作正常。 :-(
  • 我在Data Providers 文档下面找到了注释:“所有数据提供程序都在调用setUpBeforeClass 静态方法和第一次调用setUp 方法之前执行。因此您无法从数据提供程序中访问您在那里创建的任何变量。这是 PHPUnit 能够计算测试总数所必需的。有什么提示吗?

标签: php unit-testing testing phpunit


【解决方案1】:

这是一个很老的问题,但我想留下笔记。解决方案是永远不要对多个使用相同的测试实例,因为每个测试都需要不同的依赖关系。

/**
 * @covers Validation
 * @coversDefaultClass Validation
 */
class ValidationTest extends TestCase {
    /**
     * @covers ::validateType
     * @dataProvider validateTypeProdiver
     */
    public function testValidateType($assertion, $argument, $type) {
        $classUnderTest = new Validation();
        $result = $classUnderTest->validateType($argument, $type);

        switch ($assertion) {
            case 'True':
                $this->assertTrue($result);
                break;
        }
    }

    public function validateTypeProdiver() {
        return [
            ['True', 'file.txt', 'str']
       ];
    }
}

【讨论】:

  • 这绝对不能解决上述问题。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2021-08-29
相关资源
最近更新 更多