【问题标题】:How to use Moq framework to unit test azure service fabrics?如何使用 Moq 框架对 Azure 服务结构进行单元测试?
【发布时间】:2016-09-24 16:17:12
【问题描述】:

我计划使用 Moq 对我的 Azure Service Fabric 应用程序进行单元测试。我在这里看到了一些例子https://github.com/Azure-Samples/service-fabric-dotnet-web-reference-app/blob/master/ReferenceApp/Inventory.UnitTests/InventoryServiceTests.cs。我看到的测试似乎实际上是在写可靠的字典而不是嘲笑。有没有办法模拟可靠字典中的添加/删除?如何对下面的内容进行单元测试

public async Task<bool> AddItem(MyItem item)
{
    var items = await StateManager.GetOrAddAsync<IReliableDictionary<int, MyItem>>("itemDict");

    using (ITransaction tx = this.StateManager.CreateTransaction())
    {
        await items.AddAsync(tx, item.Id, item);
        await tx.CommitAsync();
    }
    return true;
}

【问题讨论】:

    标签: c# unit-testing azure moq azure-service-fabric


    【解决方案1】:

    首先在您的服务中设置您的 DI,以便您可以注入一个模拟 StateManager。您可以使用将IReliableStateManagerReplica 作为参数的构造函数来做到这一点

    public class MyStatefulService : StatefulService 
    {
        public MyStatefulService(StatefulServiceContext serviceContext, IReliableStateManagerReplica reliableStateManagerReplica)
            : base(serviceContext, reliableStateManagerReplica)
        {
        }
    }
    

    然后在您的测试中,当您创建被测系统(服务)时,使用模拟 IReliableStateManagerReplica

    var reliableStateManagerReplica = new Mock<IReliableStateManagerReplica>();
    
    var codePackageActivationContext = new Mock<ICodePackageActivationContext>();
    var serviceContext = new StatefulServiceContext(new NodeContext("", new NodeId(8, 8), 8, "", ""), codePackageActivationContext.Object, string.Empty, new Uri("http://boo.net"), null, Guid.NewGuid(), 0L);
    
    var myService = new MyService(serviceContext, reliableStateManagerReplica.Object);
    

    然后设置reliableStateManagerReplica返回一个模拟可靠字典。

    var dictionary = new Mock<IReliableDictionary<int, MyItem>>();
    reliableStateManagerReplica.Setup(m => m.GetOrAddAsync<IReliableDictionary<int, MyItem>>(name).Returns(Task.FromResult(dictionary.Object)); 
    

    最后,在您的模拟字典上设置任何模拟行为。

    编辑:更新示例代码以正确使用 Moq。

    【讨论】:

    • 使用你的解决方案,StatefulServiceContext 和 MyService 不喜欢 Mock 和 Mock
    • 看起来我在几个地方缺少 .Object。我用 NSubstitute 太久了 :)
    • 有没有办法做到这一点而无需在我的服务的构造函数中添加IReliableStateManagerReplica?我可以向StatefulServiceContext 添加一些数据吗?基本上,EntryPoints.CreateReliableStateManager(context) 期望在 StatefulServiceContext 中是什么?
    猜你喜欢
    • 2018-03-29
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2019-08-09
    相关资源
    最近更新 更多