另一个类中使用的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());
}
答案 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());
}