azure 如何模拟ServiceBusClient

zpgglvta  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(111)

我有下一个方法,注意我在做new ServiceBusClient(connectionString),我想我可以模拟这个,所以它会抛出一个desire异常。我正在使用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的构造函数有参数,所以我不能模拟类本身。有什么方法可以得到这个吗?

xj3cbfub

xj3cbfub1#

为了使代码可测试,并模拟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-然后您将受益于抽象的使用。

相关问题