PHPUnit模拟方法返回null

时间:2016-07-22 01:43:58

标签: php unit-testing phpunit

我正在尝试使用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'.

我该如何解决这个问题?

1 个答案:

答案 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()