20

我有一个测试类,其中一个测试通过 a 运行多次@dataProvider,另一个测试@depends在第一种方法上运行。但是,当我要求var_dump第二次测试应该通过什么时,它给了我一个坚实的NULL,这是我没想到的。

换句话说:这应该怎么做:

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider registerDataProvider
     */
    public function testRegister($device, $supposedResult)
    {
        //do a bunch of tests
        return array($device, $supposedResult);
    }

    public function registerDataProvider()
    {
        return array(array("foo", "foo"));
    }

    /**
     * @depends testRegister
     */
    public function testSaveDevicePreferences($deviceArr)
    {
        $this->assertNotEmpty($deviceArr);
    }
}
?>
4

3 回答 3

19

在 PHPUnit 的当前版本(截至今天为 5.4)中,这是可能的。

根据文档

当一个测试从@dataProvider 方法和它@depends 的一个或多个测试接收输入时,来自数据提供者的参数将在来自依赖测试的参数之前。依赖测试的参数对于每个数据集都是相同的。

这就是它实际上的样子:

<?php

class DataProviderAndDependsCombinationTest extends AbstractUnittest{

    public function dataProviderForSomething()
    {
        return array(
            array(
                'someProvidedValue',
                'someOtherProvidedValue'
            )
        );
    }

    public function testToDependOn()
    {
        $this->assertTrue(true);
        return 'someDependedValue';
    }

     /**
     * @dataProvider dataProviderForSomething
     * @depends testToDependOn
     */
    public function testSomething($someProvidedValue, $someOtherProvidedValue, $someDependedValue)
    {
        $this->assertSame('someProvidedValue', $someProvidedValue);
        $this->assertSame('someOtherProvidedValue', $someOtherProvidedValue);
        $this->assertSame('someDependedValue', $someDependedValue);
    }
}
于 2016-06-28T13:01:09.527 回答
13

通常@dataProvider在您希望使用不同的数据集多次运行测试时使用。它的存在是为了避免您在测试中编写循环代码,并允许不同的数据集分别通过或失败。

正如我在评论中所说,我相信 PHPUnit 将使用@depends or @dataProvider,从你的例子中我猜第二个胜出。另一种可能性是数据提供者的测试不能用作依赖项,因为 PHPUnit 不知道要选择哪个测试加数据集。

由于registerDataProvider返回单个数据集,您可以轻松地从测试本身调用它。这将允许@depends在没有@dataProvider. 假设testRegister需要修改$device和/或$supposedResult,这应该工作:

class DevicesTest extends PHPUnit_Framework_TestCase {
    public function testRegister() {
        list($device, $supposedResult) = $this->registerDataProvider();
        //do a bunch of tests
        //register a device in the DB
        return array($device, $supposedResult);
    }

    public function registerDataProvider() {
        return array("foo", "foo");
    }

    /**
     * @depends testRegister
     */
    public function testSaveDevicePreferences($data) {
        list($device, $supposedResult) = $data;
        // do stuff dependent on testRegister()
        $this->assertEquals($device, $supposedResult);
    }
}

如果第一次测试不需要修改这些变量,您可以简单地registerDataProvider从两个测试中调用。请注意,PHPUnit 不会像数据提供者机制那样将返回的数组与依赖测试分离为依赖测试的参数。这是因为它不知道返回的数组是多个参数而不是单个参数。

于 2012-05-23T15:51:22.977 回答
0

我发现不,这是不可能的。但是,通过稍微调整测试类,我已经获得了基本相同的结果,但是,如果第一个测试失败,第二个测试会愉快地运行,依赖关系似乎丢失了:

<?php 
class DevicesTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider registerDataProvider
     */
    public function testRegister($device, $supposedResult)
    {
        //do a bunch of tests
        //register a device in the DB
        return array($device, $supposedResult);
    }

    public function registerDataProvider()
    {
        return array(array("foo", "foo"));
    }

    /**
     * @depends testRegister
     * @dataProvider registerDataProvider
     */
    public function testSaveDevicePreferences($device, $supposedResult)
    {
        // do stuff dependent on testRegister()
        $this->assertEquals($device, $supposedResult);
    }
}
?>
于 2012-05-22T19:15:55.747 回答