Mocks上的phpunit reflectionexception错误

时间:2013-10-28 06:34:47

标签: php unit-testing phpunit

我一直在关注phpUnit的教程,但我似乎无法使它工作。

这是链接:

https://jtreminio.com/2013/03/unit-testing-tutorial-part-4-mock-objects-stub-methods-dependency-injection/

There was 1 error:

1) phpUnitTutorial\Test\PaymentTest::testProcessPaymentReturnsTrueOnSuccess
ReflectionException: Class Mock_AuthorizeNetAIM_2d93f549 does not have a constructor, so     you cannot pass any constructor arguments

phpUnitTutorial / Payment.php

<?php

namespace phpUnitTutorial;

class Payment
{
    const API_ID = 123456;
    const TRANS_KEY = 'TRANSACTION KEY';

    //Use Dependency Injection
    public function processPayment(\AuthorizeNetAIM $transaction, array $paymentDetails)
    {
        $transaction->amount = $paymentDetails['amount'];
        $transaction->card_num = $paymentDetails['card_num'];
        $transaction->exp_date = $paymentDetails['exp_date'];

        $response = $transaction->authorizeAndCapture();

        if ($response->approved) {
            return $this->savePayment($response->transaction_id);
        }

        throw new \Exception($response->error_message);
    }

    public function savePayment($transactionId)
    {
        // Logic for saving transaction ID to database or anywhere else would go in here
        return true;
    }
}

phpUnitTutorial /测试/ PaymentTest.php

<?php

namespace phpUnitTutorial\Test;

require_once __DIR__ . '/../Payment.php';
use phpUnitTutorial\Payment;

class PaymentTest extends \PHPUnit_Framework_TestCase
{

    public function testProcessPaymentReturnsTrueOnSuccess()
    {
        $paymentDetails = array(
            'amount' => 123.99,
            'card_num' => '4111-111-111-111',
            'exp_date' => '03/2013'
        );

        $payment = new Payment();

        // Note stdClass is used to conveniently create a generic
        // class
        $response = new \stdClass();
        $response->approved = true;
        $response->transaction_id = 123;

        $authorizeNet = $this->getMockBuilder('\AuthorizeNetAIM')
             ->setConstructorArgs(
                 array(
                     $payment::API_ID,
                     $payment::TRANS_KEY
                 )
             )->getMock();

        // $authorizeNet =  $this
        //     ->getMock(
        //         '\AuthorizeNetAIM',
        //         array(),
        //         array($payment::API_ID, $payment::TRANS_KEY)
        //     );

        $authorizeNet->expects($this->once())
            ->method('authorizeAndCapture')
            ->will($this->returnValue($response));

        $result = $payment->processPayment($authorizeNet, $paymentDetails);

        $this->assertTrue($result);
    }
}

1 个答案:

答案 0 :(得分:1)

\AuthorizeNetAIM没有构造函数 - 正如错误消息所述。所以你不能传递任何参数。以这种方式创建模拟:

$authorizeNet = $this->getMockBuilder('\AuthorizeNetAIM')->getMock();

或更短:

$authorizeNet = $this->getMock('\AuthorizeNetAIM');