gpt4 book ai didi

php - 在 PHPUnit 模拟对象中返回不同的结果

转载 作者:行者123 更新时间:2023-12-02 07:05:25 24 4
gpt4 key购买 nike

我一直在努力让我们的系统与 PHPUnit 更加兼容,这样我们就可以对我们的类进行更多的单元测试,并且已经设法让其中的一些类与模拟对象一起工作,但是我遇到了一个我可以解决的问题似乎四处走动。

我们拥有的其中一个类(我正在为其创建一个模拟版本)用于查询。您将查询字符串传递给它的“query()”方法,它会记录查询、运行它并返回结果。它还使用名为“get_row()”的方法包装 mysql_fetch_assoc,该方法返回与原始数组值非常相似的数组值。

问题是,在某些方法中,有不止一个查询被传递给“query()”方法,因此它需要运行多个 while 循环以将数据加载到不同的变量中。我在下面创建了一个简化版本:

class object{
public function __construct($query){
$this->query = $query;
}

public function loadData(){

$data1 = queryDataSource("SELECT * FROM data1");
$data2 = queryDataSource("SELECT * FROM data2");

return Array(
"data1" => $data1,
"data2" => $data2,
);

}

private function queryDataSource($query){
$this->query->query($query)

while($row = $this->query->get_row()){
$result[] = $row;
}

return $result
}
}

class testObject extends PHPUnit_Framework_TestCase{
method testLoadData(){
$test_data = Array('name' => 'Bob', 'number' => '98210');

$query = $this->getMock('Query');
$query->expects($this->any())->method('query');
$query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(2))->method('get_row')->will($this->returnValue(False);
$query->expects($this->at(3))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(4))->method('get_row')->will($this->returnValue(False);
}
}

为了逃避 $object->queryDataSource() 中的第一个 while 循环,我返回一个 bool 值 FALSE,就像执行 mysql_fetch_assoc 时会发生的那样。问题是,当它尝试运行第二个查询并通过 get_row() 获取数据时,模拟对象似乎一直返回 FALSE ratehr,而不是移动到 at(3) 点。即使有 4 个对象也会发生这种情况,只有第一个会获取测试数据作为返回值然后第二次得到 FALSE,其他每次都会得到 FALSE。

有谁知道是否有办法解决这个问题?我尝试删除 FALSE 标志并只在 at() 中使用奇数值,但那有同样的问题,我尝试让它返回 at(1-2) 的数据,但这只是将所有数据传递到第一个 while 循环,另一个没有。

感谢您能提供的任何帮助,希望问题的描述足够清楚

最佳答案

我无法运行代码,因为它似乎只是伪代码,但据我了解,您正试图像这样模拟:

Call to query, get_row, get_row, query, get_row, get_row.

您似乎遇到的问题是 ->at() 匹配器中的数字不是按 方法 计算的,而是按 对象

所以你可能想写的是:

    $query->expects($this->any())->method('query');
$query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(2))->method('get_row')->will($this->returnValue(False);
$query->expects($this->at(4))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(5))->method('get_row')->will($this->returnValue(False);

或者甚至可以让它更容易阅读:

    $query->expects($this->at(0))->method('query');
$query->expects($this->at(1))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(2))->method('get_row')->will($this->returnValue(False);
$query->expects($this->at(3))->method('query');
$query->expects($this->at(4))->method('get_row')->will($this->returnValue($test_data);
$query->expects($this->at(5))->method('get_row')->will($this->returnValue(False);

在您的模拟中,您遇到了这样一个问题,即第二次调用“query”计算一个“调用”,因此跳过了第二个 return($test_data);

关于php - 在 PHPUnit 模拟对象中返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12705368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com