I'm trying to learn how to write unit tests for durable function. Here is my code:
[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);
}
How do I write a test that covers Orchestrator, SubOrchestrator and Activity functions? Please let me know.
Here is my test so far:
[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);
}
UPDATE:
I updated the test method to:
[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);
}
which gives me an error:
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);
The above gives a null exception.