Модульное тестирование API-ответов - PullRequest
0 голосов
/ 10 октября 2018

Мне попался сценарий, в котором я не уверен, как тестировать.

Мое приложение обменивается данными с API Zoho CRM, используя официальный PHP SDK.Вот часть моего пользовательского класса, с которой у меня возникают проблемы:

class App_ZCRM_User {

    protected $record;


    public function __construct( ZCRMRecord $record ) {
        $this->record = $record;
    }


    public function create_default_tasks( array $tasks ) {
        $records = [];

        foreach( $tasks as $task ) {
            $record = ZCRMRecord::getInstance( 'Tasks', null ); // Create empty ZCRMRecord
            $record->setFieldValue( 'Subject', $task );
            $record->setFieldValue( 'User', $this->record );

            $records[] = $record;
        }

        $tasks  = ZCRMModule::getInstance( 'Tasks' );
        $insert = $tasks->createRecords( $records );

        // Returns array of EntityResponse objects
        return $insert->getEntityResponses();
    }
}

Этот класс создается с помощью записи Zoho CRM с использованием уникального идентификатора контактов

// ZCRMRecord object
$record = ZCRMRecord::getInstance( 'Contacts', 'xxxxxxxxxx' );

$user = new App_ZCRM_User( $record );
$user->create_default_tasks( array(
     'Choose vehicle make',
     'Choose vehicle model',
) );

create_default_tasks() метод связывается с Zoho API.

Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу, чтобы эти записи вставлялись в CRM при каждом запуске теста.

Я пытался смоделировать ZCRMModule для задач, но класс имеет закрытый конструктор и использует статический метод getInstance().Использование $tasks = ZCRMModule::getInstance( 'Tasks' ); и вызов $tasks->createRecords() для этого класса приведут к действующему запросу API.

Мой тест ниже, но он возвращает сообщение:

Статический метод "getInstance"не может быть вызван для фиктивного объекта

public function test_create_default_tasks() {
        $tasks = array(
            'Task 1',
            'Task 2'
        );

        $records = [];

        foreach( $tasks as $task ) {
            $record = ZCRMRecord::getInstance( 'Tasks', null );
            $record->setFieldValue( 'Subject', $task );
            $record->setFieldValue( 'User', $this->record );

            $records[] = $record;
        }

        $user = new App_ZCRM_User( $this->record );
        $user->create_default_tasks( $tasks ); // Does API request


        /**
         * I want to mock the ZCRMModule tasks and simulate the createRecords() method
         */
        $tasks = $this->getMockBuilder( 'ZCRMModule' )
                      ->disableOriginalConstructor() // Constructor is private
                      ->getMock();

        $tasks::getInstance( 'Tasks' );
        $insert = $tasks->createRecords( $records ); // Method returns null

        $created = $insert->getEntityResponses();

        // Not sure how to assert the value here...
        //$this->assertEquals(  );
    }

Я заблудился, пытаясь обернуть это вокруг головы ... как я могу протестировать этот метод, не используя живой запрос API к Zoho?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...