首页 > 解决方案 > Microsoft ServiceBus 中 QueueClient 的 NUnit 测试

问题描述

我正在mockingQueueClient. 我GetQueueClientServiceBus class. 我正在使用下面的代码。

using NUnit.Framework;
using Moq;    

[TestFixture]
    public sealed class FetchingTest
    {
        private Mock<IServiceBus> mockIServiceBus;
        private Mock<QueueClient> queueClient1;

        [TestFixtureSetUp]
        public void Setup()
        {
            this.mockIServiceBus = new Mock<IServiceBus>();
            this.queueClient1 = new Mock<QueueClient>();
        }

        [Test]
        public void TestPagingUsesCorrectOffsets()
        {
            this.mockIServiceBus.Setup(p => p.GetQueueClient(Constants.FetcherQueueName)).Returns(queueClient1.Object); // Getting error here
        }
    }

服务总线类:

using Microsoft.ServiceBus;
public class ServiceBus : IServiceBus
    {
private static readonly string ServiceBusConnectionString =
            ConfigurationManager.AppSettings[ConnectionStringNames.ServiceBus];

public QueueClient GetQueueClient(string queueName)
        {
            return QueueClient.CreateFromConnectionString(ServiceBusConnectionString, queueName);
        }
}



它抛出一个错误

Parent 没有默认构造函数。必须显式定义默认构造函数。System.NotSupportedException

有人可以帮我解决这个问题吗?

标签: c#unit-testingmoqazureservicebus

解决方案


引用QueueClient 类

确保您依赖于抽象而不是实现,以避免有问题的实现问题。

public interface IServiceBus {
    IQueueClient GetQueueClient(string queueName);
}

public class ServiceBus : IServiceBus {
    private static readonly string ServiceBusConnectionString =
        ConfigurationManager.AppSettings[ConnectionStringNames.ServiceBus];

    public IQueueClient GetQueueClient(string queueName) {
        return QueueClient.CreateFromConnectionString(ServiceBusConnectionString, queueName);
    }
}

这样抽象可以在测试时根据需要进行模拟

[TestFixture]
public sealed class FetchingTest
{
    private Mock<IServiceBus> mockIServiceBus;
    private Mock<IQueueClient> queueClient1;

    [TestFixtureSetUp]
    public void Setup() {
        this.mockIServiceBus = new Mock<IServiceBus>();
        this.queueClient1 = new Mock<IQueueClient>();
    }

    [Test]
    public void TestPagingUsesCorrectOffsets() {
        //Arrange
        this.mockIServiceBus
            .Setup(_ => _.GetQueueClient(Constants.FetcherQueueName))
            .Returns(queueClient1.Object);

        //...
    }
}

推荐阅读