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

PHPUnit Mock - 期望调用多个方法名称中的 1 个

PHPUnit Mock - 期望调用多个方法名称中的 1 个

PHP
温温酱 2023-03-26 13:57:03
我正在研究在服务中模拟记录器类并确保它尝试记录错误。它遵循psr/log接口,因此可以通过多个路由实现错误记录。调用error方法或log使用LogLevel::errorPHPUnit mocking 中有没有办法检查这个。<?php// Create a mock logger that can be observed$logger = $this->createMock(LoggerInterface::class);// This fails is $logger->log(LogLevel::error, 'some message'); is called$logger    ->expects($this->once())    ->method('error');// This fail is $logger->error() is called$logger    ->expects($this->once())    ->method('log')    ->with(LogLevel::ERROR);上面的两种方法都做同样的事情,记录错误,所以我真的不介意使用哪一种,只要使用一种即可。有没有人对如何实现这一目标有任何想法?我已经看到有一种方法叫做$this->logicalOr()但我认为它不适合目的。提前谢谢大家!
查看完整描述

1 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

得到这个工作。断言在测试用例期间抛出并记录异常。


测试与此类似的场景


<?php



class Service

{

    /**

     * @var \Psr\Log\LoggerInterface

     */

    protected $logger;



    public function setLogger(\Psr\Log\LoggerInterface $logger)

    {

        $this->logger = $logger;

    }


    public function doSomething($value)

    {

        try {

            $this->handleDoingSomething($value);

        }

        catch (Exception $e) {

            $this->logger->error($e->getMessage());


            // or optionally


            $this->logger->log(\Psr\Log\LogLevel::ERROR, $e->getMessage());


            throw $e;

        }

    }


    protected function handleDoingSomething($value)

    {

        throw new Exception();

    }

}

可以通过使用这样的测试用例来实现


<?php


class ServiceTest extends \PHPUnit\Framework\TestCase

{

    public function testDoSomething()

    {

        $loggerCalledCount = 0;

        $loggerCallback = function ($methodParameter) use (&$loggerCalledCount) {

            $loggerCalledCount++;


            return true;

        };


        $logger = $this->createMock(\Psr\Log\LoggerInterface::class);

        $logger->method('error')->with($this->callback($loggerCallback));

        $logger->method('log')->with(\Psr\Log\LogLevel::ERROR, $this->callback($loggerCallback));


        $exceptionCaught = false;

        try {

            $service = new Service();

            $value = 'this value will trigger an exception if used';

            $service->doSomething($value);

        }

        catch (Exception $e) {

            $exceptionCaught = true;

        }


        $this->assertTrue($exceptionCaught);

        $this->assertGreaterThan(0, $loggerCalledCount);

    }

}


希望能帮助人们。


查看完整回答
反对 回复 2023-03-26
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

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