Как издеваться над ServiceBusClient

У меня есть следующий метод, обратите внимание, что я делаю new ServiceBusClient(connectionString), я бы хотел, чтобы я мог издеваться над этим, чтобы он выдавал исключение желания. Я использую NSubstitute, но понятия не имею, как это сделать.

 public void Connect()
        {
            try
            {
                client = new ServiceBusClient(connectionString);
            }
            catch (Exception exception)
            {
                switch (exception)
                {
                    case FormatException _:
                        logger.LogError(new ConnectionStringFormatError(connectionString));
                        break;
                    case ServiceBusException _:
                        logger.LogError(new ConnectionError(exception.Message));
                        break;
                }
            }
        }

Конструктор ServiceBusClient имеет параметры, поэтому я не могу издеваться над самим классом. Есть ли способ получить это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы сделать этот код тестируемым и имитировать ServiceBusClient, вы должны использовать его не напрямую в своем коде, а через абстракцию.

Итак, сначала создайте абстракцию фабрики, которая создаст для вас клиента служебной шины. Что-то вроде этого:


public interface IServiceBusClientFactory
{
   ServiceBusClient GetServiceBusClient();
}

Тогда вам нужна реализация этой абстракции. И реализация этой абстракции создаст экземпляр ServiceBusClient


public class ServiceBusClientFactory : IServiceBusClientFactory
{
    private readonly string _connStr;


    public ServiceBusClientFactory(string connStr)
    {
        if (string.IsNullOrEmpty(connStr))
        {
            throw new ArgumentNullException(nameof(connStr));
        }

        _connStr = connStr;
    }

    public ServiceBusClient GetServiceBusClient()
    {
        return new ServiceBusClient(_connStr);
    }
}

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

var clientMock = Substitute.For<IServiceBusClientFactory>();
clientMock.GetServiceBusClient(Arg.Any<string>()).Returns(x => throw new FormatExcepction());

Конечно, это требует использования IoC — тогда вы выиграете от использования абстракций.

Другие вопросы по теме