【发布时间】:2018-09-13 20:19:00
【问题描述】:
我对 TDD 很陌生。我正在使用 phpunit 7.4x-dev。我有以下抽象类,我正在尝试为其开发单元测试。
use PDO;
abstract class Model {
protected static function getDB() {
static $db = null;
if ($db === null) {
$db = new PDO(ConfigDatabase::DSN, ConfigDatabase::USER, ConfigDatabase::PASSWORD);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return $db;
}
}
我创建了以下测试来解决处理静态受保护方法的需要。如果我提供“ConfigureDatabase”类,它就可以工作。
use PHPUnit\Framework\TestCase;
class ModelTest extends TestCase {
function newMockClass(){
$stub = new class() extends Model{
function getStaticMethod($methodName){
return self::$methodName();
}
};
return $stub;
}
public function testDatabaseExists() {
$stub = $this->newMockClass();
$db = $stub->getStaticMethod('getDB');
$this->assertInstanceOf(PDO::class,$db);
}
}
由于我不希望我的测试依赖于任何实际的数据库,我将如何伪造对 PDO 的调用。
【问题讨论】:
-
最简单的方法是不使用静态方法。更好地使用依赖注入。
-
你能举个例子吗?
-
将 PDO 对象作为类的构造函数的参数传递。