Foo类中的方法Bar使用调试方法记录消息。如何为方法栏编写测试代码

我的类Foo有一个称为Bar的方法,该方法在调用时记录调试消息。Foo类的__contruct方法获取\ Psr \ Log \ LoggerInterface $ logger。我在我的FooTest类中创建了一个testBar方法,但是我的Bar方法中的debug方法却出现以下错误


PHP致命错误:类Mock_LoggerInterface_a49cf619包含8个抽象方法>因此必须声明为抽象方法或实现其余>方法(Psr \ Log \ LoggerInterface :: emergency,Psr \ Log> \ LoggerInterface :: alert,Psr \ Log \ LoggerInterface ::关键...)在/var/www/html/myproject/vendor/phpunit/phpunit-mock-objects>/src/Generator.php(264)中:第1行上的eval()代码


我的课程代码如下


use Psr\Log\LoggerInterface;


class Foo {



    private $logger;

    private $myclassObject;


    public function __construct(LoggerInterface $logger)

    {

        $this->logger = $logger;

    }

    public function Bar ()

    {

      // some code

      $logger->debug ('debug message')


    }

}

我的测试课如下


use PHPUnit\Framework\TestCase;


class FooTest extends TestCase

{


    private $logger;

    public function setUp()

    {

        $this->logger = $this->getMockBuilder('\Psr\Log\LoggerInterface')

            ->setMethods(null)

            ->getMock();


        $this->logger->expects($this->any())

            ->method('debug')

            ->willReturn('Message Logged');

    }


    $this->myclassObject = $this->getMockBuilder('MyVendor\MyModule\Model\Foo')

    ->setMethods(['__construct'])        

    ->setConstructorArgs(['$logger'])

    ->disableOriginalConstructor()

    ->getMock();


    public function testBar()

    {


        $this->assertEquals($expected_result,$this->myclassObject->Bar());

    }

}


我期望看到调试消息记录为“ Message Logged”的存根调试成功的单元测试


蛊毒传说
浏览 145回答 1
1回答

小唯快跑啊

我忽略了$this->myclassObject在类级别进行定义的语法问题,因为我认为这是您创建此问题的错字。我认为您有两个问题:通过null在LoggerInterface的setMethods中进行指定,您将覆盖PHPUnit模拟类/接口的抽象/接口方法的能力,该方法告诉它不要模拟任何东西你们都禁用富构造和(作为变量名的标值引号)提供的构造ARGS您还引用了$logger不存在的内容。我还建议在您的示例中,您根本不需要部分模拟Foo,因为此时您尚未模拟其任何功能。您可以简单地致电new Foo($this->logger)。但是,我假设您的示例已精简,并且您确实需要部分模拟该类的其他部分,因此现在将其保留。试试这个:class FooTest extends TestCase{    private $logger;    private $myclassObject;    protected function setUp()    {        $this->logger = $this->createMock('\Psr\Log\LoggerInterface');        $this->logger->expects($this->any())            ->method('debug')            ->willReturn('Message Logged');        $this->myclassObject = $this->getMockBuilder('\MyVendor\MyModule\Model\Foo')            ->setConstructorArgs([$this->logger])            ->getMock();    }    public function testBar()    {        $this->assertEquals($expected_result, $this->myclassObject->Bar());    }}
打开App,查看更多内容
随时随地看视频慕课网APP