【发布时间】:2012-10-03 09:17:48
【问题描述】:
我一直在努力让我们的系统与 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 循环,我返回一个布尔 FALSE 值,就像在执行 mysql_fetch_assoc 时会发生的那样。问题是,当它尝试运行第二个查询并通过 get_row() 获取数据时,模拟对象似乎继续返回 FALSE ratehr,而不是移动到 at(3) 点。即使有 4 个对象也会发生这种情况,只有第一个将测试数据作为返回值,然后第二次返回 FALSE,其他的每次都会返回 FALSE。
有谁知道是否有办法解决这个问题?我尝试删除 FALSE 标志并在 at() 中只包含奇数值,但这有同样的问题,我尝试让它返回 at(1-2) 的数据,但这只是将所有数据传递到第一个 while 循环,另一个没有。
感谢您提供的任何帮助,希望问题的描述足够清楚
【问题讨论】: