Можно ли смоделировать расширение PECL в PHP? - PullRequest
1 голос
/ 16 января 2020

Я разрабатываю оболочку для datastax расширения cassandra .

Простое использование расширения, как показано ниже, при попытке подключения к серверу Cassandra на 127.0.0.1:9042:

$connection = \Cassandra::cluster()->build()->connect(); // instance of \Cassandra\DefaultSession

Очевидно, что он получает ошибки, так как работающий сервер недоступен.

Я пытался шаг за шагом высмеивать все эти вызовы, но он не работает. С пакетом mockery/mockery основные проблемы:

  • \Cassandra, \Cassandra\Cluster\Builder и \Cassandra\DefaultSession все определены как конечные классы
  • Все классы предварительно загружены, поэтому прокси и частичная имитация не работает
  • Я не хочу запускать сервер cassandra на моей машине, потому что он не может работать с таким тяжелым сервером, а также я хочу настроить CI для пакета, который я разрабатываю

Есть идеи, как справиться с такой ситуацией?

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Есть несколько вещей, которые вы можете сделать, чтобы избежать насмешек над всей вселенной для вашего теста.

В этом конкретном случае c создания CassandraSessionFactory уже может быть достаточно для инъекции / макета все проще.

Я бы порекомендовал, однако, разделить в Интерфейс обязанности хранилища и сделать реализацию Cassandra c.

Например, допустим, у вас есть Person коллекция / стол. И вы хотите, чтобы ваша программа могла их получать. Затем вы создадите PersonRepository интерфейс с fetchBySomething(): Person методами. Позже вы сможете создать конкретную реализацию под названием CassandraPersonRepository, которая реализует это, используя правильное расширение.

С этим выше вы можете модульный тест всего, что требует PersonRepository, с помощью дразнить только его интерфейс. И сделайте контрактные тесты только для соединения CassandraPersonRepository.

Проверьте это сообщение: https://thephp.website/en/issue/clean-tests-with-php-and-phpunit/ Есть два раздела, которые будут полезны для вашего случая: «У тестов не должно быть операций ввода-вывода» и «Всегда вводить зависимости». Они показывают быстрый способ достичь того, что я только что упомянул.

Бонусный совет : используйте Prophecy вместо Mock phpunit. Это намного проще и даже быстрее.

Надеюсь, этот ответ был полезен:)

Ура!

0 голосов
/ 17 января 2020

Вы должны разработать адаптер для API cassandra, а затем смоделировать / заменить его в тестах.

...