如何在PHPUnit中将数组作为提供程序的参数传递?

lokaqttq  于 2023-01-29  发布在  PHP
关注(0)|答案(2)|浏览(70)

我有一个接收数组作为参数的测试方法,我想从数据提供程序方法中提供数据?
如何才能做到这一点?

public function dataProvider(){
        return array(array(
                'id'=>1,
                'description'=>'',
        ));
}

/**
 * @dataProvider dataProvider
 */
public function testAddDocument($data){
// data here shall be an array provided by the data provider
// some test data here
}

所发生的是它传递“id”键的值...等等
我想传递整个数组

k2arahey

k2arahey1#

数据提供程序方法必须返回一个数组,其中每个参数集都有一个数组要传递给测试方法。若要传递数组,请将其与其他参数一起包含。请注意,在示例代码中,您将需要另一个封闭数组。
下面是一个返回两组数据的示例,每组都有两个参数(一个数组和一个字符串)。

public function dataProvider(): array
{
    return
        [// data sets
            [// data set 0
                [// first argument data set 0
                    'id'          => 1,
                    'description' => 'this',
                ],
                'foo',//second argument data set 0
            ],
            [//data set 1
                [//first argument data set 1
                    'id'          => 2,
                    'description' => 'that',
                ],
                'bar',//second argument data set 1       
            ],
        ];
}

**重要:**数据提供程序方法必须是非静态的。PHPUnit示例化测试用例以调用每个数据提供程序方法。

uurv41yg

uurv41yg2#

为了清楚起见,我喜欢编写提供程序来构建变量,这些变量命名什么是什么。
在这个例子中,我将从一个简单的数据提供程序开始,它可以获取2个电话号码和2个电话号码,最后我将使用您的特定例子。
首先,我总是将变量命名为$tests,这表明我将返回一个“表示测试的项目数组”:

public function successProvider() : array
{
    $tests = [
        [ '+11 111 11 11 111', '+11 111 11 11 111', 1, 2 ],
        [ '+11 111 11 11 111', '+55 555 55 55 555', 2, 3 ],
    ];

    return $tests;
}

如果测试用例变得更加复杂,我会通过在数组中分配一个键来逐一命名它们:

public function successProvider() : array
{
    $tests = [
        'same phone' => [ '+11 111 11 11 111', '+11 111 11 11 111', 1, 2 ],
        'phone changed' => [ '+11 111 11 11 111', '+55 555 55 55 555', 2, 3 ],
    ];

    return $tests;
}

如果每个测试用例变得更复杂,我会用单独的变量来命名每个测试用例,如下所示:

public function successProvider() : array
{
    $testSamePhone = [
        '+11 111 11 11 111',
        '+11 111 11 11 111',
        1,
        2,
    ];

    $testPhoneChanged = [
        '+11 111 11 11 111',
        '+55 555 55 55 555',
        2,
        3,
    ];

    $tests = [
        $testSamePhone,
        $testPhoneChanged,
    ];

    return $tests;
}

为了弄清楚每件事是什么,有时我在每个测试中设置一个键,我通常使这些键类似于测试中接收参数的变量名,如下所示:

public function successProvider() : array
{
    $testSamePhone = [
        'possibleNumber' => '+11 111 11 11 111',
        'realNumber' => '+11 111 11 11 111',
        'numberOfLogCalls' => 1,
        'numberOfEvents' => 2,
    ];

    $testPhoneChanged = [
        'possibleNumber' => '+11 111 11 11 111',
        'realNumber' => '+55 555 55 55 555',
        'numberOfLogCalls' => 2,
        'numberOfEvents' => 3,
    ];

    $tests = [
        $testSamePhone,
        $testPhoneChanged,
    ];

    return $tests;
}

现在它变得超级可读,不需要“注解”(Clean Code规则提倡代码自己说话)。
现在,如果输入的电话号码不是数字,而是一个数字数组,假设我们有“一组possibleNumbers“,而不是“一个possibleNumber“:

public function successProvider() : array
{
    $testSamePhone = [
        'possibleNumbers' => [ '+11 111 11 11 111', '+3 333 333', '+999 999 9 9 9 9' ],
        'realNumber' => '+11 111 11 11 111',
        'numberOfLogCalls' => 1,
        'numberOfEvents' => 2,
    ];

    $testPhoneChanged = [
        'possibleNumbers' => [ '+11 111 11 11 111', '+3 333 333',  ],
        'realNumber' => '+55 555 55 55 555',
        'numberOfLogCalls' => 2,
        'numberOfEvents' => 3,
    ];

    $tests = [
        $testSamePhone,
        $testPhoneChanged,
    ];

    return $tests;
}

∮就你而言∮
我将这样编写数据提供程序:

public function dataProvider() : array
{
    $testDescriptiveNameOfTheTestCase = [
        'data' => [ 'id' => 1, 'description' => '' ],
    ];
    
    $tests = [
        $testDescriptiveNameOfTheTestCase,
    ];
    
    return $tests;
}

或者更紧凑:

public function dataProvider() : array
{
    $tests = [
        'Descriptive name of the Test Case' => [
            'data' => [ 'id' => 1, 'description' => '' ],
        ],
    ];

    return $tests;
}

相关问题