【发布时间】:2013-08-12 05:31:48
【问题描述】:
我正在尝试在管理数据库连接的类上使用 TDD。不过
- 我经常远离可用数据库的网络进行开发
- 我只想测试类,不要弄乱真正的连接,即使是 SQLite
:memory: - 我可能想以独立于平台的方式测试连接(例如,将 PDO 对象交换为 MySQLi 对象等)。尤其是数据库不全是 MySQL,有些是 SQLServer。
基本上我想这样做:
class ConnectionManager {
...
public function getConnection($name) {
$params = $this->lookup($name);
return new \PDO($params['spec'], $params['username'], $params['password']);
}
}
在我的测试运行器中:
class ConnectionManagerTest extends \PHPUnit_Framework_TestCase {
public function testGetConnection() {
$cxn = new ConnectionManager();
$this->assertNotNull($cxn->getConnection('test')); // or whatever
}
}
不知何故,我想使用 PDO 类的模拟。向测试类构造函数或其方法之一添加显式参数是我唯一的选择吗?我已经尝试按照 Mockery 文档使用“实例模拟”,但由于我使用自动加载导致“致命错误无法重新声明类”(duh)。
我不希望使用纯粹用于测试的代码来污染合约,但这是我唯一的选择吗?
感谢您的帮助
【问题讨论】:
-
你的连接管理器总是(并且只)返回一个
PDO。所以你可能首先需要一个不同的连接管理器,因为你的测试现在已经出来了? -
实际上连接管理器的问题不太重要,因为 PDO 支持多种不同的连接类型。主要问题是在网络外开发时,真正的连接不可用。稍后我可能不得不将这些“普通的旧 PHP 对象”放入框架中,但我还不知道是哪个,所以我希望尽可能与实现无关
-
好吧,我只是因为名字而戳了戳。如果您需要该工作,请创建
class ConnectionManagerStub extends ConnectionManager,然后更改您需要测试的那些,以便在保留存根以进行协作的同时消除依赖关系,例如对于您的测试根本不使用任何 PDO(或内存中的一个或其他什么)。
标签: unit-testing tdd phpunit mockery