У меня есть следующий метод, обратите внимание, что я делаю 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 имеет параметры, поэтому я не могу издеваться над самим классом. Есть ли способ получить это?





Чтобы сделать этот код тестируемым и имитировать 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 — тогда вы выиграете от использования абстракций.