PHPUnit数据提供程序参数计数错误

7

我刚开始使用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>

是的,这就是为什么它只通过一次。如果您调查错误消息,您会看到它说“0 通过”,这意味着它没有通过任何提供的参数。 :-( - A.N.M. Saiful Islam
1
我在数据提供程序文档下面找到了一个注释:“所有的数据提供程序都会在调用setUpBeforeClass静态方法和第一次调用setUp方法之前执行。因此,你不能从数据提供程序中访问任何你在那里创建的变量。这是为了让PHPUnit能够计算测试的总数所必需的。” 有什么提示吗? - A.N.M. Saiful Islam
  1. 你使用哪个集成开发环境(IDE)?
  2. 你是如何运行测试的?(请复制粘贴命令)
- BVengerov
大家好,感谢你们的关心。但是我已经想出了自己的解决方案,它可以替代“数据提供程序”功能,而且更好。我认为我将在未来的所有实现中使用它。但是如果问题能够得到解决,那么对于那些面临/将要面临相同问题的人来说会更好。 :) - A.N.M. Saiful Islam
如果没有其他人能够重现这种不一致的行为,而你没有发布的唯一内容是验证类本身的代码,那么这可能就是不一致行为存在的地方。 - still_dreaming_1
显示剩余4条评论
2个回答

0

-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']
       ];
    }
}

这绝对不能解决上述描述的问题。 - elenaHristova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接