-
05-07-2019 - |
题
我的旧代码没有使用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”得到一个实例 我的模拟对象被忽略,这是有道理的
所以我只看到两个选项
- phpunit的一些功能我不知道 - 这就是我在这里问的原因^^
- 我必须修改旧代码 - 我知道会更好 醇>
所以,有人知道选项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;
}
}
这样你就可以控制结果会发生什么。
不隶属于 StackOverflow