我可以使用@depends依赖于使用@dataProvider的测试吗?

Zsu*_*sub 16 php phpunit unit-testing

我有一个测试类,其中一个测试通过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);
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

Maj*_*jiy 17

在当前版本的PHPUnit(截至今天的5.4)中,它是可能的.

根据文件:

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

这就是实际看起来的样子:

<?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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 问题并不是真正要问的。OP在依赖的测试上具有@dataProvider,而不是依赖于另一个的测试(如此处所示)。 (5认同)

Dav*_*ess 10

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

正如我在评论中所说,我相信PHPUnit将使用@depends 或者 @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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果第一次测试不需要修改这些变量,则只需registerDataProvider从两个测试中调用即可.请注意,PHPUnit不会在测试时将返回的数组与依赖项分离为依赖测试的参数,如数据提供程序机制所做的那样.这是因为它不知道返回的数组是多个参数而不是单个参数.

  • 来自@dataProvider的数据排在最前面,而不是来自@depends的数据。这就是对我有效的方式。 (2认同)