我的旧代码没有使用TDD 现在我想为一个看起来像这个
的函数编写一个测试function somefunction($someargs){
// do a few checks on $someargs
$database = new DB_PG();
$result = $database->select($query);
// do some changes on result
return $result;
}
因为我对phpunit和一般的测试没有多少经验 我的问题是: 我该如何模拟DB_PG? 我在我的测试中尝试了getMock(),但由于该函数使用“new”来获取实例 我的模拟对象被忽略,这是有道理的
所以我只看到两个选项
所以,有人知道选项1的答案吗?
全部
答案 0 :(得分:1)
选项1
您可以按如下方式更改功能:
function someFunc($existingArgs, $db = null)
{
$db = (is_null($db)) = new DB_PG();
$result = $db->select($query)
$return $result;
}
这样你就可以传入一个db实例,这让你至少可以测试这个函数,将来你可以重构一些东西,比如someFunc的工作在模型上,而db加载的东西是通过dao / repository / factory发生的
选项2
如果DB_PG尚未通过此函数所在文件中的require / include引入,则可以在测试类中定义一个虚拟类
class DB_PG
{
public function select($query)
{
//use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
return $mockResult;
}
}
这样你就可以控制结果会发生什么。