【问题标题】:Azure C# EventHubClient mock for unit test用于单元测试的 Azure C# EventHubClient 模拟
【发布时间】:2017-07-12 08:16:53
【问题描述】:

我正在为我们的应用程序编写一个事件发布者,它在内部使用Azure C# EventHubClient

我想对我的事件正确转换为 EventData 对象(属性 + 正文)以及其他一些功能进行单元测试。长话短说,我需要一些方法来为 EventHubClient 创建一个模拟。不幸的是,似乎没有一种简单的方法可以做到这一点:

  • EventHubClient 未实现任何相关接口,因此使用 Moq 或 NSubstitute 之类的东西来创建模拟将不起作用。
  • EventHubClient 是一个具有内部构造函数的抽象类,因此我无法扩展它并创建自定义模拟。

理论上,我可以围绕我想使用的方法创建一个包装接口和类,但这意味着需要维护更多代码。有人知道使用 EventHubClient 进行单元测试的更好方法吗?

【问题讨论】:

  • 看看他们是如何测试它的,看看它是否对这个主题有所启发github.com/Azure/azure-event-hubs-dotnet/tree/dev/test/…
  • @Nkosi 感谢您的提示。他们正在从环境变量加载真实事件中心的连接字符串,所以它更像是集成测试......我想这对他们的用例很有意义。
  • @Nkosi 终于找到了答案in the repo:单元测试友好应该快来了。
  • 我不认为微软“很快”会大步向前——到目前为止,他们只是拒绝了 PR。

标签: c# unit-testing azure-eventhub


【解决方案1】:

我刚刚为 EventHubClient 编写了一个简单的包装器,然后对其进行了模拟。

public class EventHubService : IEventHubService
{
    private EventHubClient Client { get; set; }

    public void Connect(string connectionString, string entityPath)
    {
        var connectionStringBuilder = new EventHubsConnectionStringBuilder(connectionString)
            {
                EntityPath = entityPath
            };

        Client =  EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
    }

    public async void Disconnect()
    {
        await Client.CloseAsync();
    }

    public Task SendAsync(EventData eventData)
    {
        return Client.SendAsync(eventData);
    }
}

然后测试很简单:var eventHubService = new Mock<IEventHubService>();

【讨论】:

    猜你喜欢
    • 2021-10-18
    • 2011-04-11
    • 2022-08-02
    • 2021-05-01
    • 2021-12-08
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2022-10-01
    相关资源
    最近更新 更多