例如,我们有一个返回结果集的cron作业。我需要能够根据模拟结果集测试runjobs
方法调用正确的方法。
function runJobs($results) {
foreach (results as $row) {
if ($row->blah === 'condition') {
$this->runJobA($row);
} else {
$this->runJobB($row);
}
}
}
function runJobA($row) {
//do something
}
function runJobB($row) {
//do something
}
答案 0 :(得分:3)
可以使用部分模拟来实现它。
快速且未经测试的提案:
$mock = $this->createMock('classname', array('runJobA', 'runJobB'));
$mock->expects($this->once())
->method('runJobA');
$mock->runJobs(...);
如果指定特定方法名称作为createMock()
方法的第二个参数,则phpunit模拟库会生成所谓的部分模拟。
与“普通”模拟相比 - 在部分模拟中,所有方法都使用现有的实际实现,但是您指定的模拟将被模拟。
答案 1 :(得分:1)
获取一个类的decission代码:
class JobSelector
{
public function getJobRunnerMethodName($results)
{
// some logic here for getting JobA or JobB
$method = "runJobA";
return $method;
}
}
现在你可以测试一下:
public function testJobAMethodReturnedWhenBlah()
{
$sut = new JobSelector();
$result = "blah";
$this->assertEquals('runJobA', $sut->getJob($result));
}
public function testJobBMethodReturnedWhenBlah()
{
....
}
另外,您可以在其自己的类中实现每个作业,并使JobSelector类返回Job实例。然后测试返回的作业类型而不是方法名称。你的代码将成为:
$job_selector = new JobSelector();
$job = $job_selector->getJob();
$job->run();