重用PHPUnit数据提供程序

重用PHPUnit数据提供程序,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我不确定我是否能做到,我是否也应该做到。我正在编写一些可能具有相同数据提供程序(IP地址或整数)的测试 然后,当我使用$this->parser->setFormat(“%a”)时,我必须进行测试,该参数也接收IP地址作为参数。在本例中,我复制所有代码只是为了更改一行。应该是这样吗?有什么方法可以重用这些数据提供程序吗?我认为只要数据提供程序方法是同一类的一部分,就应该能够毫无问题地重用这些数据提供程序。您可以将其包含在抽象测试用例中,您的测试用例从中继承或使用php 5.4+中的特性。继承的类

我不确定我是否能做到,我是否也应该做到。我正在编写一些可能具有相同数据提供程序(IP地址或整数)的测试


然后,当我使用
$this->parser->setFormat(“%a”)
时,我必须进行测试,该参数也接收IP地址作为参数。在本例中,我复制所有代码只是为了更改一行。应该是这样吗?有什么方法可以重用这些数据提供程序吗?

我认为只要数据提供程序方法是同一类的一部分,就应该能够毫无问题地重用这些数据提供程序。您可以将其包含在抽象测试用例中,您的测试用例从中继承或使用php 5.4+中的特性。

继承的类不能是另一个测试吗?当我的
RemoteIpAddressTest
扩展
LocalIpAddressTest
时,我必须复制所有方法(提供程序除外)才能正常工作。或者我应该为提供者的实现创建一个
IpAddressProvider
,并且这两个测试都是从它扩展而来的?我不完全理解这个用例。您不想用相同的IP地址提供程序测试不同的解析器(ApacheLogParser、MyOtherParser)(无效和成功)?或者您想用不同的数据集测试ApacheLogParser,这就是您的注释所指出的?您还可以使用@Dependes()语法将引用从一个测试传递到另一个测试,例如填充的数组()。等等,@RafaelKassner,那么就不需要你说的依赖了。我认为@Bram的解决方案会起作用。@RafaelKassner,您可以在同一个测试用例中对%a和%a进行测试。您只有几行测试代码,所以我认为提取这些代码来分离类没有任何意义。或者你也可以按照我的回答去做。您必须创建一个包含数据提供程序的
IpAddressFormatTestCase
,并允许Locale和Remote从中扩展。但imo最干净的解决方案是将数据提供者作为一种特性提供,这将允许水平重用(继承只能扩展另一个类)。您也可以在非解析器测试中轻松地使用该特性。
class LocalIpAddressTest extends \PHPUnit_Framework_TestCase
{

    protected $parser = null;

    protected function setUp()
    {
        $this->parser = new ApacheLogParser();
        $this->parser->setFormat('%A');
    }

    protected function tearDown()
    {
        $this->parser = null;
    }

    /**
     * @dataProvider successProvider
     */
    public function testSuccess($line)
    {
        $entry = $this->parser->parse($line);
        $this->assertEquals($line, $entry->localIp);
    }

    /**
     * @expectedException \Kassner\ApacheLogParser\FormatException
     * @dataProvider invalidProvider
     */
    public function testInvalid($line)
    {
        $this->parser->parse($line);
    }

    public function successProvider()
    {
        return array(
            array('192.168.1.1'),
            array('192.168.001.01'),
            array('172.16.0.1'),
            array('192.168.0.255'),
            array('8.8.8.8'),
            // not sure about those 2. They are valid ip-format, but can't be assigned as server address
            array('0.0.0.0'),
            array('255.255.255.255'),
        );
    }

    public function invalidProvider()
    {
        return array(
            // over 255
            array('192.168.1.256'),
            array('256.256.256.256'),
            array('321.432.543.654'),
            // incomplete
            array('192.168.1.'),
            array('192.168.1'),
            array('192.168.'),
            array('192.168'),
            array('192.'),
            array('192'),
            array(''),
            // malformed
            array('1921.68.1.1'),
            array('192.681.1.'),
            array('.1921.68.1.1'),
            array('....'),
            array('1.9.2.'),
            array('192.168.1.1/24'),
            // letters (it' not supporting IPv6 yet...)
            array('abc'),
            array('192.168.1.x'),
            array('insert-ip-address-here'),
            array('a.b.c.d'),
        );
    }

}