为 Service Fabric 应用程序类编写单元测试

Posted

技术标签:

【中文标题】为 Service Fabric 应用程序类编写单元测试【英文标题】:Writing UnitTests for a Service Fabric Application Class 【发布时间】:2021-03-27 00:16:30 【问题描述】:

我正在。我遇到了一些我不明白如何解决的错误。 类定义是这样的:

namespace SearchService

    internal sealed class SearchServiceClass : StatelessService
    
        //variables defined followed by constructor
        private string jsonStr;
        public SearchServiceClass(StatelessServiceContext context)
            : base(context)
        
            //constructor stuff
        
        
        public bool IsDataJsonLoaded
        
            get
            
                return !(jsonStr == null);
            
        
    

应用程序有一个定义如下的测试类:

namespace SearchService.Tests

    //[TestClass]
    public class SearchServiceClassTest
    
        [Fact]
        public void SearchServiceClassConstructor()
        
           var searchServiceClass = new SearchServiceClass();
           Assert.True(searchServiceClass.IsDataJsonLoaded);
        
    

我收到以下错误:

没有给出与所需形式相对应的参数 参数“上下文”的 'SearchServiceClass.SearchServiceClass(StatelessServiceContext)'。

谁能告诉我如何解决这个问题?

编辑:我一直在查看 ServiceFabric.Mocks。我的理解是我需要使用MockStatelessServiceContextFactory.Default 来创建一个模拟上下文。我该怎么做,以下是正确的方法吗?:

var searchServiceClass = new SearchServiceClass(MockStatelessServiceContextFactory.Default);

【问题讨论】:

SearchServiceClass 的构造函数只有一个参数,所以在创建它的对象时需要传递它。因为,你不能不创建 StatelessServiceContext 的对象,所以你应该在调用构造函数时使用模拟。 如果你不想默认行为,这是正确的方法。否则,您可以使用带有所有必需参数的MockStatefulServiceContextFactory.Create() 创建一个新的MockStatefulServiceContextFactory。根据代码示例,使用默认值是可以的。 【参考方案1】:

是的,您可以使用ServiceFabric.Mocks 库,通过以下代码创建服务的测试实例:

var serviceInstance = new SearchServiceClass(MockStatelessServiceContextFactory.Default);

作为Default 上下文的替代方案,您还可以构建自定义实例:

var newUri = new Uri("fabric:/MockApp/OtherMockStatelessService");
var serviceTypeName = "OtherMockServiceType";
var partitionId = Guid.NewGuid();
var replicaId = long.MaxValue;
var context = new MockCodePackageActivationContext("fabric:/MyApp", "MyAppType", "Code", "Ver", "Context", "Log", "Temp", "Work", "Man", "ManVer");
var context = MockStatelessServiceContextFactory.Create(context, serviceTypeName, newUri, partitionId, replicaId);
var serviceInstance = new SearchServiceClass(context);

请参阅this sample test 和this one 了解更多信息。

【讨论】:

以上是关于为 Service Fabric 应用程序类编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Service Fabric:将枚举类移动到不同的项目

从 .Net Core Stateless Service 调用 .Net 框架 Service Fabric Actor

ServiceFabric极简文档-5.0 Service Fabric有状态与无状态

Service Fabric Actors 或 Azure Functions

用于从本地 Service Fabric 探索和查询 ETW 日志的工具

Service Fabric Actor 备份适用于 1 个参与者,而其他所有参与者都失败