为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
蛊毒传说 2021-05-10 12:35:01
我的类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”的存根调试成功的单元测试
查看完整描述

1 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我忽略了$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());

    }

}


查看完整回答
反对 回复 2021-05-28
  • 1 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信