PHPUnit:使用数据提供程序在多个条件下测试is_a

时间:2019-06-07 20:48:43

标签: phpunit

我正在尝试为以下方法编写测试:

/**
 * @dataProvider attributesValuesProvider
 */
public function myFunction($entityObject, $diffArr, $prevArr)
{
    ....
    ....

    if (is_a($entityObject, Customer::class)) {
        $entityType = CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER;
    } elseif (is_a($entityObject, Address::class)) {
        $entityType = AddressMetadataInterface::ENTITY_TYPE_ADDRESS;
    } else {
        $entityType = null;
    }
    ....
    ....

    return $entityType;
}

我已经定义了以下数据提供者:

public function attributesValuesProvider()
{
    return [
        [null, [], []],
        [Customer::class, [], []],
        [Address::class, [], []],
    ];
}

我在各个方面都进行了扭曲,但我仍然想不出一种编写此测试的方法。我没有单元测试的相关经验,所以我可能走错了路。

1 个答案:

答案 0 :(得分:1)

您的数据提供者需要提供预期的结果以及方法参数。 You can see a simple example in the PHPUnit documentation.

public function attributesValuesProvider()
{
    return [
        [null, [], [], null],
        [new Customer, [], [], CustomerMetadataInterface::ENTITY_TYPE_CUSTOMER],
        [new Address, [], [], AddressMetadataInterface::ENTITY_TYPE_ADDRESS],
    ];
}

使用数据提供程序的测试将对提供程序中的每一行执行一次,并将该行中的所有值作为其参数传递。因此,您的测试只需接受所有四个参数,调用该方法并验证是否返回了预期结果。

/**
 * @dataProvider attributesValuesProvider
 */
public function testMyFunction($object, $diff, $prev, $expected_result) {

    $example = new YourClass();
    // or maybe you already created this object in your setUp method?

    $actual_result = $example->myFunction($object, $diff, $prev);
    $this->assertSame($expected_result, $actual_result);
}