我知道staticexpected在PHPUnit 3.8中已被弃用,并将在以后的版本中完全删除。但是在我们的项目中,到处使用静态函数。所以,制作phpunit是一个大问题。在我们的开发中,phpunit版本是4.6.6,我不能回到3.8。我的问题是我怎么做像staticexpectations ?代码:
class A {
public static function staticfun(){
//dosomething....
}
}
class B {
public static function callA(){
A::staticfun();
}
}
class TestA extends PHPUnit_Framework_TestCase{
public function test(){
//I want to mock staticfun()
B::callA();
}
}
要做到这一点,您需要使用像uopz这样的扩展,它允许您在运行时重新定义函数和方法。
在您的测试类中,您将添加如下内容:
public static function setupBeforeClass()
{
uopz_backup("A", "staticfun");
uopz_function("A", "staticfun", function () {
// do something else
});
}
public static function tearDownAfterClass()
{
uopz_restore("A", "staticfun");
}
这将:
- 备份原方法
- 将其重新定义为给定的闭包
- 类中的测试完成后恢复原始
一般情况下,不能模拟静态函数调用。如果您打算用模拟测试软件,就不要使用静态调用。你可以试着摆弄一些邪恶的把戏,但这通常是一个巨大的痛苦。
您可能没有仔细阅读PHPUnit的staticexpectations特性的文档。它不能满足你的需要。Sebastian在PHPUnit 3.5中实现了这个特性,但它并没有像他预期的那样工作,因为人们不了解它的局限性。所以它在3.8中再次被删除。
面对使用静态调用创建不可测试软件的事实。开始抛弃它们,并以这种方式提高软件的可测试性。这是痛苦的,将花费时间,但这是唯一的方法。