Phpunit skeletongenerator基于@assertregexp注释的自动生成测试方法的问题

时间:2015-09-18 11:31:56

标签: unit-testing annotations phpunit assertions

我遇到了一些问题。

如果我根据以下类创建测试方法:

<?php
class Calc
{
    /**
     * @assert (0, 0) == 0
     * @assert (0, 1) == 1
     */
    public function add($a, $b)
    {
        return $a + $b;
    }
}

...然后我得到:

<?php

/**
 * Generated by PHPUnit_SkeletonGenerator on 2015-09-07 at 10:34:19.
 */
require_once '../Calc.php';
class CalcTest extends PHPUnit_Framework_TestCase {

    /**
     * @var Calc
     */
    protected $object;

    protected function setUp() {
        $this->object = new Calc;
    }

    protected function tearDown() {

    }

    /**
     * Generated from @assert (0, 0) == 0.
     *
     * @covers Calc::add
     * @group production
     */
    public function testAdd() {
        $this->assertEquals(
                0
                , $this->object->add(0, 0)
        );
    }

    /**
     * Generated from @assert (0, 1) == 1.
     *
     * @covers Calc::add
     * @group production
     * @group development
     */
    public function testAdd2() {
        $this->assertEquals(
                1
                , $this->object->add(0, 1)
        );
    }
}

......这很酷。它就像一个魅力。

但是如果我想在另一个类中使用注释@assertRegExp(expectedRegex,string pattern):

<?php
class RegexExample {

    private $input;

    public function __construct() {}

    /**
     * @assertRegExp ('/^[0-9]*$/', $this->object->setDigit('Mowgli'))
     * @assertRegExp ('/^[0-9]*$/', $this->object->setDigit('79579534'))
     */
    public function setDigit($inp) {
        $this->input= $inp;
    }
}

...当我创建测试方法时,现在生成了测试类,但它没有实现测试方法:

<?php

/**
 * Generated by PHPUnit_SkeletonGenerator on 2015-09-18 at 13:22:27.
 */
class RegexExampleTest extends PHPUnit_Framework_TestCase {

    /**
     * @var User
     */
    protected $object;

    protected function setUp() {
        $this->object = new User;
    }

    protected function tearDown() {

    }

    /**
     * @covers User::setDigit
     * @todo   Implement testSetDigit().
     */
    public function testSetDigit() {
        // Remove the following lines when you implement this test.
        $this->markTestIncomplete(
                'This test has not been implemented yet.'
        );
    }
}

重点是得到像这样的测试方法:

public function testSetDigit() {
        $this->assertRegExp(
                '/^[0-9]*$/'
                ,   $this->object->setDigit('Mowgli')
        );
    }

...哪个有效,但如果我想做fx n数字af测试方法,我宁愿在我自己的对象类中使用注释,而不是复制/粘贴和编辑方法。

如果我找到解决方案,我会在这里发布。

我是phpunit的菜鸟,所以可能是我做的一个蹩脚的菜鸟错误。如果是这样,请提前预约。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我想知道你从哪里知道@assertRegexp是一个有效的断言注释。我搜索了子项目的存储库&#34; PHPUnit SkeletonGenerator&#34;并且未找到任何暗示您可以使用正则表达式的引用:https://github.com/sebastianbergmann/phpunit-skeleton-generator/search?p=1&q=assert&type=Code&utf8=%E2%9C%93

此外,您的断言注释没有意义。这些注释旨在提供工作单元测试断言。首先,您测试的函数不返回任何内容,因此没有值可以使用正则表达式。其次,你没有提供一种方法来表明字符串的正则表达式断言&#34; Mowgli&#34;应该失败 - 至少是我对这个案子的期望。

请记住,功能的可用性或缺少取决于您使用的版本,因此请指出您正在使用的PHPUnit版本和骨架生成器。