PHPUnit在另一个类中使用的mock方法

时间:2014-03-27 04:19:08

标签: php unit-testing testing paypal phpunit

另一个类中使用的PHPUnit mock方法? 例如:

class Main {
  function makePayment() {
    $pp = new PayPalSOAPSomeClass();
    return $pp->doExpressCheckout();
  }
}

在测试中我想测试我的Main类,并模拟doExpressCheckout()方法,我的工作代码没有用来测试:

public function testStub()    {
        $stub = $this->getMock('PayPalSOAPSomeClass');
        $stub->expects($this->any())
             ->method('doExpressCheckout')
             ->will($this->returnValue(false));
        $pp = new Main;
        $this->assertEquals(true, $pp->doExpressCheckout());
    }

1 个答案:

答案 0 :(得分:2)

测试Main类时遇到问题。第一个问题是它在内部创建了一个对象。您需要修改此类以使用依赖项注入。你的makePayment()应该接受PayPalSOAPSomeClass对象。

function makePayment(PayPalSOAPSomeClass $pp)
{
    return $pp->doExpressCheckout();
}

在您的主类中,您可以修改它以使用构造函数依赖注入或setter依赖注入,这比makePayment更好。然后,引用内部对象。

例如:

class Main {
    private $svc;

    // Constructor Injection, pass the PayPalSOAPSomeClass object here
    public function __construct($Service = NULL)
    {
        if(! is_null($Service) )
        {
            if($Service instanceof PayPalSOAPSomeClass)
            {
                $this->SetPayPalSOAP($Service);
            }
        }
    }

    function SetPayPalSOAP(PayPalSOAPSomeClass $Service)
    {
        $this->svc = $Service;
    }

    function makePayment() {
        $pp = $this->svc;
        return $pp->doExpressCheckout();
    }
}

测试:

public function testStub()    
{
    $stub = $this->getMock('PayPalSOAPSomeClass');
    $stub->expects($this->any())
        ->method('doExpressCheckout')
        ->will($this->returnValue(false));
    $pp = new Main($stub);
    $this->assertEquals(true, $pp->doExpressCheckout());
}