为 Azure Durable Functions 中的编排函数编写单元测试

时间:2021-06-11 05:14:31

标签: moq azure-durable-functions

我正在尝试学习如何为持久函数编写单元测试。这是我的代码:

    [FunctionName("OrchestratorFunction")]
    public async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
    {
            var jobs = await context.CallActivityAsync<List<Job>>("JobsReaderFunction"), null);
            if (jobs != null && jobs .Count > 0)
            {
                var processingTasks = new List<Task>();
                foreach (var job in jobs)
                {                    
                    Task processTask = context.CallSubOrchestratorAsync("SubOrchestratorFunction"), job);
                    processingTasks.Add(processTask);
                }
                await Task.WhenAll(processingTasks);               
            }
    }

    [FunctionName("SubOrchestratorFunction")]
    public async Task RunSubOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)        
    {
            var job = context.GetInput<Job>();
            var group = await context.CallActivityAsync<Group>("GroupReaderFunction"), job);
            await context.CallActivityAsync("EmailSenderFunction", group);
            var canWriteToGroup = await context.CallActivityAsync<bool>("GroupVerifierFunction", job);            
            await context.CallActivityAsync("JobStatusUpdaterFunction", new JopStatusUpdaterRequest { CanWriteToGroup = canWriteToGroup, Job = job });
            await context.CallActivityAsync("TopicMessageSenderFunction", job);
    }    

如何编写涵盖 Orchestrator、SubOrchestrator 和 Activity 功能的测试?请告诉我。

这是我目前的测试:

        [TestMethod]
        public async Task VerifyOrchestrator()
        {            
            var jobs = <code to get jobs>
            var context = new Mock<IDurableOrchestrationContext>();           
            context.Setup(m => m.CallActivityAsync<List<Job>>("JobsReaderFunction", It.IsAny<object>())).ReturnsAsync(jobs);
            await _orchestratorFunction.RunOrchestrator(context.Object);
        }

更新:

我将测试方法更新为:

        [TestMethod]
        public async Task VerifyJobs()
        {            
            var jobs = <code to get jobs>
            var context = new Mock<IDurableOrchestrationContext>();           
            context.Setup(x => x.CallSubOrchestratorAsync("SubOrchestratorFunction"), It.IsAny<object>())).Returns(() => _orchestratorFunction.RunSubOrchestrator(context.Object));            
            await _orchestratorFunction.RunOrchestrator(context.Object);
        }

这给了我一个错误:

enter image description here

context.Setup(x => x.CallSubOrchestratorAsync("SubOrchestratorFunction", It.IsAny<object>())).Returns(async () => await It.IsAny<Task>());
await _orchestratorFunction.RunOrchestrator(context.Object);
context.Verify(m => m.CallSubOrchestratorAsync("SubOrchestratorFunction", It.IsAny<string>(), It.IsAny<object>()),Times.Once);

上面给出了一个空异常。

1 个答案:

答案 0 :(得分:0)

根据以下行模拟上下文:

var context = new Mock<IDurableOrchestrationContext>();           

这意味着当您执行 Context.CallSubOrchestratorAsync("SubOrchestratorFunction") moq search for setup 时。 因为该方法没有任何设置,所以它什么都不运行并返回默认返回值。

如果你想执行RunSubOrchestrator,你应该设置它:

context.Setup(x => x.CallSubOrchestratorAsync("SubOrchestratorFunction", It.IsAny<object>())).Returns(() => _orchestratorFunction.RunSubOrchestrator(context.Object))