小编典典
静态方法本身并不比实例方法难测试。当一个方法(静态方法或其他方法)调用 其他
静态方法时会出现问题,因为您无法隔离正在测试的方法。这是一个很难测试的典型示例方法:
public function findUser($id) {
Assert::validIdentifier($id);
Log::debug("Looking for user $id"); // writes to a file
Database::connect(); // needs user, password, database info and a database
return Database::query(...); // needs a user table with data
}
您可能想用这种方法测试什么?
传递除正整数以外的任何东西都会抛出异常InvalidIdentifierException。
Database::query() 接收正确的标识符。
null如果没有找到,则返回匹配的用户。
这些要求很简单,但是您还必须设置日志记录,连接到数据库,向数据库中加载数据等。Database该类应独自负责测试其可以连接和查询。该Log班应该记录这样做。findUser()应该不必处理任何此类问题,但是必须这样做,因为这取决于它们。
相反,如果上述方法在Database和Log实例上调用了实例方法,则该测试可以传入具有特定于测试的脚本化返回值的模拟对象。
function testFindUserReturnsNullWhenNotFound() {
$log = $this->getMock('Log'); // ignore all logging calls
$database = $this->getMock('Database', array('connect', 'query');
$database->expects($this->once())->method('connect');
$database->expects($this->once())->method('query')
->with('', 5)
->will($this->returnValue(null));
$dao = new UserDao($log, $database);
self::assertNull($dao->findUser(5));
}
如果findUser()忽略调用connect(),传递$id(5)的错误值或返回以外的其他值,则上述测试将失败null。优点是不涉及任何数据库,从而使测试快速而稳健,这意味着它不会因与测试无关的原因而失败,例如网络故障或错误的样本数据。它使您可以专注于真正重要的事情:中包含的功能findUser()。
2020-05-29