首先让我说:欢迎来到单元测试的阴暗面。
含义:您通常不想这样做,但正如您所解释的那样,您似乎有一个有效的用例。
运行套件
您可以很轻松地做的事情,不是微不足道,而是比更改应用程序架构更容易,就是使用 runkit 动态更改类行为
runkit_method_rename(
get_class($object), 'methodToMock', 'methodToMock_old'
);
runkit_method_add(
get_class($object), 'methodToMock', '$param1, $param2', 'return 7;'
);
runkit::method_add
并在测试后使用 method_remove 并再次重命名。我不知道有任何框架/组件可以帮助您解决这个问题,但在UglyTestsBaseTest extends PHPUnit_Framework_TestCase 中您自己实现的并不多。
嗯……
如果您只能访问该对象的引用(如:$x = new Foo(); 中的 $x),我不知道有什么办法可以说:$x,您现在属于 SomethingElse 类型指向该对象的所有其他变量也应该改变。
我假设您已经知道 testing your privates 之类的东西,但这对您没有帮助,因为您无法控制 the objects life cycle。
php 测试助手扩展
注意:the Test-Helper extension is supersededhttps://github.com/krakjoe/uopz
这里还可以帮助您的是:Stubbing Hard-Coded Dependencies 使用 php-test-helpers extension,它允许您执行 拦截对象创建之类的操作。
这意味着,当您的应用程序调用 $x = new Something(); 时,您可以破解 PHP 以使 $x 然后包含 YourSpecialCraftedSomething 的实例。
您可以使用 PHPUnit Mocking API 创建该类或自己编写。
据我所知,这些是您的选择。如果值得去那里(或者只是为该项目编写集成/硒测试)是您必须自己弄清楚的事情,因为这在很大程度上取决于您的情况。