【问题标题】:NUnit test for QueueClient in Microsoft ServiceBusMicrosoft ServiceBus 中 QueueClient 的 NUnit 测试
【发布时间】:2018-07-24 14:49:58
【问题描述】:

我正在为QueueClient 创建mocking。我在ServiceBus class 中有GetQueueClient。我正在使用下面的代码。

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

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

【问题讨论】:

  • 你应该改用IQueueClient抽象。
  • @Nkosi 我尝试使用它,但我无法导入所需的库。
  • 如果无法访问它,请考虑创建自己的抽象和实现来包装实际客户端
  • 刚查了,界面是公开的。为什么你不能访问它

标签: c# unit-testing moq azureservicebus


【解决方案1】:

参考QueueClient Class

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

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);

        //...
    }
}

【讨论】:

  • 我们使用的是Microsoft.ServiceBus.Messaging,所以它与Microsoft.Azure.ServiceBus冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多