Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit错误致命错误:调用未定义的方法Mock_Game_073a8e20::method()_Php_Unit Testing_Phpunit - Fatal编程技术网

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

PHPUnit错误致命错误:调用未定义的方法Mock_Game_073a8e20::method(),php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我目前正在观看一个使用PHP单元的指南,但当涉及到模拟时,我总是会遇到这个错误 游戏课 class Game { protected $title; protected $imagePath; protected $ratings; public function getAverageScore(){ $ratings = $this->getRatings(); $numRatings = count($ratings);

我目前正在观看一个使用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塞巴斯蒂安·伯格曼

。。。致命错误:调用未定义的方法 中的Mock_Rating_5c2598e3::方法() 第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_命令::main()E:\xampp\php\PHPUnit:46 0.1800 365008 3. PHPUnit\u TextUI\u Command->run()E:\xampp\php\pear\PHPUnit\TextUI\Command.php:129 0.3070 1401944 4. PHPUnit\u TextUI\u TestRunner->doRun()E:\xampp\php\pear\PHPUnit\TextUI\Command.php:176 0.3200 1614568 5. PHPUnit\u Framework\u TestSuite->run()E:\xampp\php\pear\PHPUnit\TextUI\TestRunner.php:349 0.3810 1873016 6. PHPUnit\u Framework\u TestSuite->runTest()E:\xampp\php\pear\PHPUnit\Framework\TestSuite.php:745 0.3810 1873016 7. PHPUnit\u Framework\u TestCase->run()E:\xampp\php\pear\PHPUnit\Framework\TestSuite.php:775 0.3810 1872984 8. PHPUnit\u Framework\u TestResult->run()E:\xampp\php\pear\PHPUnit\Framework\TestCase.php:776 0.3820 1873600 9. PHPUnit\u Framework\u TestCase->runBare()E:\xampp\php\pear\PHPUnit\Framework\TestResult.php:648 0.3830 1904096 10. PHPUnit\u Framework\u 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_与6和8_返回7() E:\xampp\php\pear\PHPUnit\Framework\TestCase.php:976


从PHPUnit 5.4开始,函数getMock已被弃用:

PHPUnit\Framework\TestCase::getMock()方法已被弃用。 请使用PHPUnit\Framework\TestCase::createMock()或 改为PHPUnit\Framework\TestCase::getMockBuilder()

您的代码中不包含评级类,但如果包含评级类,您会这样模拟它:

$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获取一系列评级,但我把它留给你去编码…

奇怪的是,这对于模拟Rate类来说很好,而对于Game类来说则不行。检查类名是否正确(是否使用命名空间?)