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

Posted

技术标签:

【中文标题】PHPUnit 错误致命错误:调用未定义的方法 Mock_Game_073a8e20::method()【英文标题】:PHPUnit Error Fatal error: Call to undefined method Mock_Game_073a8e20::method() 【发布时间】:2016-12-23 12:45:13 【问题描述】:

我目前正在观看使用 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,塞巴斯蒂安·伯格曼(Sebastian Bergmann)。

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

调用堆栈: 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\pear\PHPUnit\Framework\TestCase.php:976

【问题讨论】:

奇怪的想法是模拟 Rate 类而不是 Game 类的效果很好。检查类名是否正确(你使用命名空间吗?) 【参考方案1】:

自 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;  

然后你不模拟那个调用,你用模拟的 Rating 对象来调用它:

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

我认为您的意思是让 getRatings 获取一组 Ratings,但我将其留给您编写代码...

【讨论】:

以上是关于PHPUnit 错误致命错误:调用未定义的方法 Mock_Game_073a8e20::method()的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:调用未定义的方法 Upload::do_upload()

PHPUnit 错误:调用未定义的方法 Tests\Unit\ExampleTest::visit()

PhpUnit 未显示 php 致命错误的堆栈跟踪

PhpUnit 未显示 php 致命错误的堆栈跟踪

如何修复 PHPUnit 中的“PHP 致命错误:未捕获的 TypeError:getTest() 参数”错误

致命错误:未捕获的错误:调用未定义的方法 stdClass::option();