如何将返回值替换为函数

时间:2017-01-25 14:27:44

标签: php phpunit

我想对一个调用其中的另一个函数B的函数A做一个phpUnit测试,如何替换函数B的返回来继续我的测试成功

public function A($parameter = null){
// do something
$response_B = $this->B();
// continue with the function A
}

注意:函数B在SQL中对数据库进行查询。在我的测试中我不想做任何查询,只是我想预先定义函数B的结果。 我曾尝试使用Mocks和Stubs,但实际上我并不完全理解它。 抱歉我的英文

2 个答案:

答案 0 :(得分:0)

功能示例:

function pass(){
 $test = check(3);
 return $test; //returns true when 3 is parameter used to call function check()
}

function check($int) {
 if ($int == 3) {
 return true;
 } else {
 return false;
}

答案 1 :(得分:0)

所以你想要的,称为“Mocking”,这不适用于简单的功能。

使其简单。(代码未经过测试)

class MySpecialClass
{
 public function doSomeSpecialThings(){
  $response = $this->doFancySQL();
  return $response;
 }
}

所以如果你想操纵方法调用,你必须将它提取到外部类并注入它

class MySpecialClass
{
  public function setFancySqlInterface(FancySqlInterface $fancySqlInterface){
 $this->fancySqlInterface = $fancySqlInterface;
 }
 public function doSomeSpecialThings(){
  $response = $this->fancySqlInterface->doFancySQL();
  return $response;
 }
}

有了这个,现在你可以在测试中使用方法setFancySqlInterface和一个返回特定响应的假类。

您可以为此任务创建假类或使用“模拟框架”

作为一个例子,你可以在这里看到

https://github.com/BlackScorp/guestbook/blob/master/tests/UseCase/ListEntriesTest.php#L35我创建假实体并将它们添加到Fake存储库https://github.com/BlackScorp/guestbook/blob/master/tests/UseCase/ListEntriesTest.php#L70

希望你理解我的意思:D