PHPUnit错误致命错误:调用未定义的方法Mock_Game_073a8e20 :: method()

时间:2016-08-17 01:27:37

标签: php unit-testing phpunit

我目前正在观看使用PHP单元的指南,当涉及到模拟时,我总是会遇到此错误。

游戏类

class Game {

    protected $title;   protected $imagePath;   protected $ratings;

    public function getAverageScore(){

        $ratings = $this->getRatings();         $numRatings = count($ratings);

        $total = 0;

        if($numRatings == 0){           return null;        }


        foreach($ratings as $rating){

            $total = $rating->getScore();

        }

        return $total / $numRatings;

    }

    public function isRecommended()
    {
        return $this->getAverageScore() >= 3;
    }

    public function getTitle(){         return $this->title;    }

    public function setTitle($value){       $this->title = $value;  }

    public function getImagePath(){         if($this->imagePath == null){           return '/images/placeholder.jpg';       }       return $this->imagePath;    }

    public function setImagePath($value){       return $this->imagePath = $value;   }

    public function getRatings(){       return $this->ratings;  }

    public function setRatings($value){         return $this->ratings = $value;     }

}

测试用例

public function testAverageScore_With6And8_Returns7(){

    $ratings1 = $this->getMock('Rating', ['getScore']);
    $ratings1->method('getScore')
             ->willReturn(6);

    $ratings2 = $this->getMock('Rating', ['getScore']);
    $ratings2->method('getScore')
             ->willReturn(8);

    $game = $this->getMock('Game', ['getRatings']);
    $game->method('getRatings')
         ->willReturn([$ratings1, $ratings2]);
    $this->assertEquals(7, $game->getAverageScore());

}

错误:

  

E:\ xampp \ htdocs \ gamebook> phpunit src / Test / Unit / GameTest.php PHPUnit   3.7.21 by Sebastian Bergmann。

     

...致命错误:调用未定义的方法   Mock_Rating_5c2598e3 :: method()in   第40行的E:\ xampp \ htdocs \ gamebook \ src \ Test \ Unit \ GameTest.php

     

调用堆栈:       0.0670 126024 1. {main}()E:\ xampp \ php \ phpunit:0       0.1800 361592 2. PHPUnit_TextUI_Command :: main()E:\ xampp \ php \ phpunit:46       0.1800 365008 3. PHPUnit_TextUI_Command-> run()E:\ xampp \ php \ pear \ PHPUnit \ TextUI \ Command.php:129       0.3070 1401944 4. PHPUnit_TextUI_TestRunner-> doRun()E:\ xampp \ php \ pear \ PHPUnit \ TextUI \ Command.php:176       0.3200 1614568 5. PHPUnit_Framework_TestSuite-> run()E:\ xampp \ php \ pear \ PHPUnit \ TextUI \ TestRunner.php:349       0.3810 1873016 6. PHPUnit_Framework_TestSuite-> runTest()E:\ xampp \ php \ pear \ PHPUnit \ Framework \ TestSuite.php:745       0.3810 1873016 7. PHPUnit_Framework_TestCase-> run()E:\ xampp \ php \ pear \ PHPUnit \ Framework \ TestSuite.php:775       0.3810 1872984 8. PHPUnit_Framework_TestResult-> run()E:\ xampp \ php \ pear \ PHPUnit \ Framework \ TestCase.php:776       0.3820 1873600 9. PHPUnit_Framework_TestCase-> runBare()E:\ xampp \ php \ pear \ PHPUnit \ Framework \ TestResult.php:648       0.3830 1904096 10. PHPUnit_Framework_TestCase-> runTest()E:\ xampp \ php \ pear \ PHPUnit \ Framework \ TestCase.php:831       0.3830 1904592 11. ReflectionMethod-> invokeArgs()E:\ xampp \ php \ pear \ PHPUnit \ Framework \ TestCase.php:976       0.3830 1904704 12. GameTest-> testAverageScore_With6And8_Returns7()   E:\ XAMPP \ PHP \梨\ PHPUnit的\框架\ TestCase.php:976

1 个答案:

答案 0 :(得分:4)

自PHPUnit 5.4起,函数getMock已被弃用:

  

不推荐使用PHPUnit \ Framework \ TestCase :: getMock()方法。   请使用PHPUnit \ Framework \ TestCase :: createMock()或   改为PHPUnit \ Framework \ TestCase :: getMockBuilder()。

您的代码中不包含Rating类,但如果是,您可以像这样嘲笑它:

$ratings1 = $this->createMock('Rating');
$ratings1->method('getScore')
    ->willReturn(6);

此外,在您上次的模拟语句中,您传递了两个参数,但函数:

public function getRatings(){       return $this->ratings;  }

没有两个参数,需要:

public function getRatings($rating1, $rating2) {      
    return ($rating1->getScore() + $rating2->getScore())/2;  
}

然后你不要模拟那个电话,你用模拟的评级对象来调用它:

$game = new Game();
$answer = $game->getRatings($ratings1, $ratings2);
$this->assertSame(7,$answer);

我认为你的意思是让getRatings采用一系列评级,但我会留给你代码......