我一直在研究如何将单元测试覆盖率添加到用PHP编写的大型现有代码库中.静态和可实例化类中的许多函数都会调用库或实例化对象,以获取与memcache和数据库的连接.它们通常看起来像这样:
public function getSomeData() {
$key = "SomeMemcacheKey";
$cache = get_memcache();
$results = $cache->get($key);
if (!$results) {
$database = new DatabaseObject();
$sql = "SELECT * from someDatabase.someTable";
$results = $database->query($sql);
$cache->set($key, $results);
}
return $results;
}
Run Code Online (Sandbox Code Playgroud)
我和我的同事正在尝试通过PHPUnit实现我们正在编写的一些新类的覆盖.我试图找到一种方法来为我们现有的代码库中的函数创建单独的测试单元测试,类似于上面的伪代码但是不成功.
我在PHPUnit文档中看到的示例都依赖于在类中使用一些方法来附加模拟对象,例如:
$objectBeingTested->attach($mockObject);
我查看了SimpleUnit,并在那里看到了相同的东西,模拟对象正在通过它的构造函数传递给类.这不会为实例化自己的数据库对象的函数留下太多空间.
有没有办法模拟这些类型的电话?我们可以使用另一个单元测试框架吗?或者我们是否必须改变我们将来使用的模式以便于单元测试?
我想做的是在运行测试时能够用模拟类替换整个类.例如,DatabaseObject类可以替换为mock类,并且在测试期间实例化它时,它实际上是模拟版本的实例.
我的团队一直在讨论重构我们在新代码中访问数据库和内存缓存的方法,也许是使用单例.我想如果我们以这样一种方式编写单例,它可以用模拟对象替换它自己的实例,那会有所帮助......
这是我第一次涉足单元测试.如果我做错了,请说出来.:)
谢谢.