我正在尝试使用PHPUnit
测试下面的类class stripe extends paymentValidator {
public $apiKey;
public function __construct ($apiKey){
$this->apiKey = $apiKey;
}
public function charge($token) {
try {
return $this->requestStripe($token);
} catch(\Stripe\Error\Card $e) {
echo $e->getMessage();
return false;
}
}
public function requestStripe($token) {
// do something
}
}
我的测试脚本如下所示:
class paymentvalidatorTest extends PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function test_stripe() {
// Create a stub for the SomeClass class.
$stripe = $this->getMockBuilder(stripe::class)
->disableOriginalConstructor()
->setMethods(['requestStripe', 'charge'])
->getMock();
$stripe->expects($this->any())
->method('requestStripe')
->will($this->returnValue('Miaw'));
$sound = $stripe->charge('token');
$this->assertEquals('Miaw', $sound);
}
}
使用我的测试脚本,我希望stripe :: charge()方法的测试双精度与原始类中的定义完全相同,而stripe :: requestStripe()将返回'Miaw'。因此,$ stripe-> charge('token')也应该返回'Miaw'。但是,当我运行测试时,我得到:
Failed asserting that null matches expected 'Miaw'.
我该如何解决这个问题?
答案 0 :(得分:5)
在您调用setMethods
的地方,您告诉PHPUnit模拟类应该模拟这些方法的行为:
->setMethods(['requestStripe', 'charge'])
在您的情况下,您似乎想部分模拟该类,以便requestStripe()
返回Miaw
,但您希望charge
运行其原始代码 - 您应该删除{来自模拟方法的{1}}:
charge
在你了解它的同时,你也可以指定你期望$stripe = $this->getMockBuilder(stripe::class)
->disableOriginalConstructor()
->setMethods(['requestStripe'])
->getMock();
$stripe->expects($this->once())
->method('requestStripe')
->will($this->returnValue('Miaw'));
$sound = $stripe->charge('token');
$this->assertEquals('Miaw', $sound);
被调用的次数 - 它是一个额外的断言,没有额外的努力,如使用requestStripe()
并没有为您提供任何额外的好处。我已在示例中使用$this->any()
。