首页 文章

phpunit mock没有默认方法,模拟SUT确实有效

提问于
浏览
0

我正在尝试测试一个Symfony实体'RoiCalc',并且phpunit的模拟框架没有按预期工作 .

例1:

我想测试控制器中的计算函数正好调用某些实体getter两次:

$subject = new RoiCalcController();

$snippets = array(
...some data...
);

$entityMock = $this->getMock( 'RoiCalc' );

$entityMock->expects( $this->exactly( 2 ) )->method( 'getFeedCost' );

$subject->doResultCalculation( $entityMock, $snippets );

在这个例子中,我收到一条错误消息

Call to undefined method Mock_RoiCalc_6dec5a53::getHerdSize()

我期待$ this-> getMock('RoiCalc');会嘲笑班上的所有方法,至少是公共方法吗? getHerdSize是一个公共函数

例2:

我想检查我的实体中的方法setDefault是否从数组中设置了正确的值:

$snippets = array(
    'roi_early_season_milk_production_day' => 2,
    'roi_typical_nvo_cows_9_default' => 3,
    'roi_typical_nvo_cows_21_default' => 4,
    'roi_value_ms_default' => 5,
    'roi_cost_of_feed' => 6,
    'roi_extra_feed_cow_day' => 7,
    'roi_incremental_value_heifer_default' => 8,
    'roi_dib_synch_treatment_cost_default' => 9,
    'roi_reduction_nvo_next_year_9' => 10,
    'roi_reduction_nvo_next_year_21' => 11
);

$subject = $this->getMockBuilder( 'RoiCalc' )
    ->setMethods('setTreatmentOptionId')
    ->getMock();

$subject->expects( $this->once )->method( 'setTreatmentOptionId' )->with ( $this->equalsTo( 1 ) );

$subject->setDefaults( $snippets );

在这种情况下,我收到一个错误

Call to undefined method Mock_RoiCalc_f857be9e::setDefaults()

我期望对于这个部分模拟,除了setTreatmentOptionId之外,所有函数都将来自我的类

PHPUnit 3.8.27和4.0.20都会发生此行为

1 回答

  • 0

    因为我已经为测试类使用了命名空间,所以我似乎必须使用实体的全名,在我的例子中:

    $subject = $this->getMockBuilder( '\BundleGroup\BundleName\Entity\RoiCalc' )
    

    要么

    $mock = $this->getMock( '\BundleGroup\BundleName\Entity\RoiCalc' )
    

相关问题