验证一个实例方法是否调用另一个

时间:2014-02-02 21:24:05

标签: unit-testing mocking phpunit

例如,我们有一个返回结果集的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
}

2 个答案:

答案 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();