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