【问题标题】:PHPUnit mock method from another class来自另一个类的 PHPUnit 模拟方法
【发布时间】: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.');
  }
}

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

【问题讨论】:

    标签: php mocking phpunit


    【解决方案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.');
      }
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2014-05-05
      • 2015-07-19
      • 2016-07-17
      • 2013-04-16
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      • 2014-10-14
      相关资源
      最近更新 更多