Каков наилучший подход для модульного тестирования с Braintree? - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время я использую .NET SDK для обработки платежей в своем основном проекте asp.net. Я хотел бы автоматизировать тесты с использованием модульных тестов, но это оказывается трудным.

Все классы, используемые библиотекой, в частности «Подписка» и многие другие, имеют внутренние конструкторы или ожидают другие внутренние экземпляры. Такие параметры, как создание экземпляра из json для передачи его через функцию, отсутствуют.

Также невозможно создать собственный экземпляр, поскольку все свойства классов являются геттерами, и только классы "* request" имеют установщики, но это не очень помогает, поскольку приложению не нужно их обрабатывать.

Тестовый класс Webhook совершенно бесполезен, поскольку предоставляемый им экземпляр пуст, только с установленными идентификатором и состоянием. Моему приложению требуется больше данных из подписки, таких как экземпляр транзакции, дополнения, даты выставления счетов и т. Д .; все из которых не заселены.

У меня есть несколько классов, которые требуют тестирования, и выполнять их вручную просто непрактично и тратить много времени. Есть ли другой подход, который я пропускаю?

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

1 Ответ

0 голосов
/ 07 апреля 2019

Для тех, кто все еще ищет, нет никакого способа провести модульное тестирование непосредственно на самих классах без редактирования библиотеки. С другой стороны, не вся надежда потеряна, с использованием MOQ (https://github.com/Moq/moq4/wiki/Quickstart), который позволяет высмеивать классы - и более того. Я использовал это, чтобы высмеивать классы, которые я интересовался тестированием, в качестве примера , чтобы создать транзакцию, над которой у меня есть полный контроль, я бы:

Макет объекта транзакции.

    public Mock<Result<Transaction>> SuccessTransaction_Mock { get; set; }

    public Result<Transaction> SuccessTransaction => SuccessTransaction_Mock.Object;

Настройте методы, которые интересует ваш модульный тест.

    // Success Transaction
    SuccessTransaction_Mock = new Mock<Result<Transaction>>();
    SuccessTransaction_Mock.Setup(s => s.IsSuccess())
            .Returns(true);
    SuccessTransaction_Mock.SetupGet(s => s.Target)
            .Returns(BtTransaction);
    SuccessTransaction_Mock.SetupGet(s => s.Message)
            .Returns("");

Assert

    Assert.True(SuccessTransaction.IsSuccess()) // Will return the value that was setup in the moq object

Вы можете смоделировать практически любой из классов в клиентской библиотеке Braintree, если методы являются виртуальными (большинство классов имеют интерфейсы, которые вы можете использовать).

...