PHPUnit安装程序,用于使用dataProvider运行单个测试

PHPUnit安装程序,用于使用dataProvider运行单个测试,php,unit-testing,phpunit,runkit,Php,Unit Testing,Phpunit,Runkit,我有一个PHPUnit测试testFoo()和一个数据提供者fooProvider()。在testFoo()的开头,我正在使用Runkit重新定义一个方法,以便在该方法返回我重新定义的返回值时可以测试预期结果。然而,重新定义这个方法需要花费一点时间,所以我希望它在这个测试中只发生一次 PHPUnit框架是否提供功能来指定我希望在运行testFoo()之前只运行一次的代码,而不是为fooProvider()返回的每个元素运行一次,或者为套件中的每个测试运行一次(如setUp())。您需要它是静态的

我有一个PHPUnit测试
testFoo()
和一个数据提供者
fooProvider()
。在
testFoo()
的开头,我正在使用Runkit重新定义一个方法,以便在该方法返回我重新定义的返回值时可以测试预期结果。然而,重新定义这个方法需要花费一点时间,所以我希望它在这个测试中只发生一次


PHPUnit框架是否提供功能来指定我希望在运行
testFoo()
之前只运行一次的代码,而不是为
fooProvider()
返回的每个元素运行一次,或者为套件中的每个测试运行一次(如
setUp()
)。您需要它是静态的,因为测试类是为dataProvider提供的每个案例实例化的

class FooTest extends PHPUnit_Framework_TestCase
{
    private static $redefined = false;

    /**
     * @dataProvider fooProvider
     */
    public function testFoo()
    {
        if (! self::$redefined) {

            // redefinition code goes here

            self::$redefined = true;
        }
    }
}

怎么样?@xmike我需要多次重新定义所述方法,以便为不同的测试返回不同的内容,因此它确实需要特定于单个测试,而不是我以前一直使用您的
,而是我自己的提供者在测试中所做的事情,比如
$dataSets=$this->getDataSets()
(应该返回数据数组),然后在循环中使用断言对其进行循环。这样,PHPUnit框架只会启动测试一次,因此
setUp()
也只会运行一次(从它的角度来看,测试只会运行一次)。我想我希望在测试之前有一个
@beforeTest
注释来指定一个要运行一次的函数,这样我就不需要用循环和引用设置来混乱我的测试方法。但是从我从PHPUnit文档中看到的不存在的东西来看?事实上你是对的,
@beforeTest
在每次测试之前只运行一次测试。问题是,如果您使用
@dataProvider
,测试将针对每个数据集重新启动,从而使
@before
也可以执行——这就是PHPUnit框架处理数据提供的方式(发生这种情况的原因是,必须使用每个新数据集调用测试,并将新数据集作为参数接收)。因此,避免重新启动的方法不是使用自动数据提供。我希望在PHPUnit框架内找到解决方案(我将编辑我的问题以澄清这一点)。我正在不同的测试中重新定义相同的方法,最好不要手动跟踪每个方法,以及是否已重新定义is,以及是否已重新定义为每个测试的适当替代方法。在这种情况下,您可以拥有一个处理方法重新定义并从所有测试中使用的类。该类应该知道w哪些方法已经被重新定义,并且在方法已经被重新定义的情况下什么也不做。这会起作用,但会是一种相当迂回的方法,可以防止方法被多次重新定义(与xmike在问题注释中的解决方法相比,或者与类似于
setup()的函数相比)
来自PHPUnit框架)