我目前正在观看使用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
答案 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采用一系列评级,但我会留给你代码......