猿问

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

我正在研究在服务中模拟记录器类并确保它尝试记录错误。它遵循psr/log接口,因此可以通过多个路由实现错误记录。调用error方法或log使用LogLevel::error


PHPUnit 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()但我认为它不适合目的。


提前谢谢大家!


温温酱
浏览 106回答 1
1回答

凤凰求蛊

得到这个工作。断言在测试用例期间抛出并记录异常。测试与此类似的场景<?phpclass Service{&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* @var \Psr\Log\LoggerInterface&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; protected $logger;&nbsp; &nbsp; public function setLogger(\Psr\Log\LoggerInterface $logger)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $this->logger = $logger;&nbsp; &nbsp; }&nbsp; &nbsp; public function doSomething($value)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this->handleDoingSomething($value);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch (Exception $e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this->logger->error($e->getMessage());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // or optionally&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this->logger->log(\Psr\Log\LogLevel::ERROR, $e->getMessage());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw $e;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; protected function handleDoingSomething($value)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; throw new Exception();&nbsp; &nbsp; }}可以通过使用这样的测试用例来实现<?phpclass ServiceTest extends \PHPUnit\Framework\TestCase{&nbsp; &nbsp; public function testDoSomething()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $loggerCalledCount = 0;&nbsp; &nbsp; &nbsp; &nbsp; $loggerCallback = function ($methodParameter) use (&$loggerCalledCount) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $loggerCalledCount++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; $logger = $this->createMock(\Psr\Log\LoggerInterface::class);&nbsp; &nbsp; &nbsp; &nbsp; $logger->method('error')->with($this->callback($loggerCallback));&nbsp; &nbsp; &nbsp; &nbsp; $logger->method('log')->with(\Psr\Log\LogLevel::ERROR, $this->callback($loggerCallback));&nbsp; &nbsp; &nbsp; &nbsp; $exceptionCaught = false;&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $service = new Service();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $value = 'this value will trigger an exception if used';&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $service->doSomething($value);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch (Exception $e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $exceptionCaught = true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; $this->assertTrue($exceptionCaught);&nbsp; &nbsp; &nbsp; &nbsp; $this->assertGreaterThan(0, $loggerCalledCount);&nbsp; &nbsp; }}希望能帮助人们。
随时随地看视频慕课网APP
我要回答