对于组成另一个对象作为其实现的一部分的对象,编写单元测试以便只测试主要对象的最佳方法是什么?简单的例子:
class myObj {
public function doSomethingWhichIsLogged()
{
// ...
$logger = new logger('/tmp/log.txt');
$logger->info('some message');
// ...
}
}
我知道可以设计该对象,以便可以注入记录器对象依赖项并因此在单元测试中进行模拟,但情况并非总是如此 - 在更复杂的场景中,您确实需要组合其他对象或调用静态方法.
由于我们不想测试记录器对象,只测试 myObj,我们如何进行?我们是否使用测试脚本创建了一个存根的“双重”?就像是:
class logger
{
public function __construct($filepath) {}
public function info($message) {}
}
class TestMyObj extends PHPUnit_Framework_TestCase
{
// ...
}
这对于小对象来说似乎是可行的,但对于 SUT 依赖于返回值的更复杂的 API 来说会很痛苦。另外,如果你想测试对依赖对象的调用,你可以使用模拟对象吗?有没有办法模拟由 SUT 实例化而不是传入的对象?
我已经阅读了关于模拟的手册页,但它似乎没有涵盖依赖组合而不是聚合的这种情况。你怎么做呢?