来自另一个类的 PHPUnit 模拟方法

Posted

技术标签:

【中文标题】来自另一个类的 PHPUnit 模拟方法【英文标题】:PHPUnit mock method from another class 【发布时间】:2022-01-04 20:25:28 【问题描述】:

使用 phpUnit 6.5.14,我正在尝试测试一种方法。为此,需要模拟其依赖项之一;但是我无法让它工作。这是一个精简版:

class Order 
  public function create() 
    $CCP = new CreditCardProcessor();
    $success = $CCP->chargeCreditCard();
    return $success;
  



class CreditCardProcessor 
  public function chargeCreditCard() 
    return false;
  

class OrderTest extends TestCase 
  public function testCreate() 
    $mockCCP = $this->getMockBuilder(CreditCardProcessor::class)
      ->setMethods(['chargeCreditCard'])
      ->getMock();

    $mockCCP
      ->method('chargeCreditCard')
      ->willReturn(true);

    $O = new Order();
    $success = $O->create();

    $this->assertTrue($success, 'Was not able to create order.');
  


我已阅读文档并查看了一些示例,但无法弄清楚。任何想法我做错了什么?谢谢。

【问题讨论】:

【参考方案1】:

在找到更多示例后,我认为解决方案是将依赖项作为参数传递给create

class Order 
  public function create($CCP) 
    $success = $CCP->chargeCreditCard();
    return $success;
  

然后我可以在我的测试中做同样的事情:

class OrderTest extends TestCase 
  public function testCreate() 
    $mockCCP = $this->getMockBuilder(CreditCardProcessor::class)
      ->setMethods(['chargeCreditCard'])
      ->getMock();

    $mockCCP
      ->method('chargeCreditCard')
      ->willReturn(true);

    $O = new Order();
    $success = $O->create($mockCCP);

    $this->assertTrue($success, 'Was not able to create order.');
  

我还没有尝试过,但应该可以。

我不喜欢更改代码以满足测试的想法,但这可能也表明我需要重组我的代码。

【讨论】:

以上是关于来自另一个类的 PHPUnit 模拟方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”?

来自 void 类的模拟异步调用

来自 Guzzle 的 PHPUnit 和模拟请求

phpunit 避免模拟的构造函数参数

模拟/存根在 PHPUnit 中实现数组访问的类的对象

FilterIterator 应该是 PHPUnit\Framework\TestSuiteIterator 的实例