如何使用 phpunit 4.6.6 及更高版本模拟静态函数
How can I mock a static function with phpunit 4.6.6 and later
我知道 staticExpects 从 PHPUnit 3.8 开始被弃用,并将在以后的版本中完全删除。
但是在我们的项目中,使用静态函数everywhere.So,使phpunit.And成为一个大问题在我们的开发中,phpunit版本是4.6.6,我不能回到3.8。
我的问题是我怎样才能像 staticExpects 那样做?
代码:
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();
}
}
在一般情况下,您可以不模拟静态函数调用。如果您打算使用模拟测试您的软件,请不要使用静态调用。你可以尝试 fiddle 恶作剧,但这通常是一个巨大的痛苦。
您可能没有完整阅读 PHPUnit 的 staticExpects 特性的文档。它不做你需要的。 Sebastian 在 PHPUnit 3.5 中实现了该功能,但它并没有像他预期的那样工作,因为人们不理解它的局限性。所以在3.8又被移除了
面对这样一个事实,即您使用静态调用创建了无法测试的软件。开始抛弃它们并以此方式提高软件的可测试性。很痛苦,也很费时间,但这是唯一的办法。
为此,您需要使用像 uopz 这样的扩展,它允许您在运行时重新定义函数和方法。
在您的测试中 class 您将添加如下内容:
public static function setupBeforeClass()
{
uopz_backup("A", "staticfun");
uopz_function("A", "staticfun", function () {
// do something else
});
}
public static function tearDownAfterClass()
{
uopz_restore("A", "staticfun");
}
这将是:
- 备份原方法
- 将其重新定义为给定的闭包
- 在 class 中的测试完成后恢复原始状态
我知道 staticExpects 从 PHPUnit 3.8 开始被弃用,并将在以后的版本中完全删除。 但是在我们的项目中,使用静态函数everywhere.So,使phpunit.And成为一个大问题在我们的开发中,phpunit版本是4.6.6,我不能回到3.8。 我的问题是我怎样才能像 staticExpects 那样做? 代码:
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();
}
}
在一般情况下,您可以不模拟静态函数调用。如果您打算使用模拟测试您的软件,请不要使用静态调用。你可以尝试 fiddle 恶作剧,但这通常是一个巨大的痛苦。
您可能没有完整阅读 PHPUnit 的 staticExpects 特性的文档。它不做你需要的。 Sebastian 在 PHPUnit 3.5 中实现了该功能,但它并没有像他预期的那样工作,因为人们不理解它的局限性。所以在3.8又被移除了
面对这样一个事实,即您使用静态调用创建了无法测试的软件。开始抛弃它们并以此方式提高软件的可测试性。很痛苦,也很费时间,但这是唯一的办法。
为此,您需要使用像 uopz 这样的扩展,它允许您在运行时重新定义函数和方法。
在您的测试中 class 您将添加如下内容:
public static function setupBeforeClass()
{
uopz_backup("A", "staticfun");
uopz_function("A", "staticfun", function () {
// do something else
});
}
public static function tearDownAfterClass()
{
uopz_restore("A", "staticfun");
}
这将是:
- 备份原方法
- 将其重新定义为给定的闭包
- 在 class 中的测试完成后恢复原始状态