In theory unit testing in Botframework V4 should easy enough as it’s based on .net core. But, as with many things, it might not be that obvious. So here is a quick snippet showing a test for a Waterfall flow;
[TestMethod] public async Task Waterfall() { var convoState = new ConversationState<Dictionary>(new MemoryStorage()); var adapter = new TestAdapter() .Use(convoState); //var dialogState = convoState.CreateProperty("dialogState"); var dialogs = new DialogSet(); dialogs.Add("textPrompt", new TextPrompt()); dialogs.Add("test", new WaterfallStep[] { async (dc, args, next) => { await dc.Context.SendActivity("Welcome! We need to ask a few questions to get started."); await dc.Prompt("textPrompt", "What's your name?"); }, async (dc, args, next) => { dc.ActiveDialog.State["name"] = args["Value"]; await dc.Context.SendActivity($"Thanks {args["Value"]}!"); await dc.End(); } } ); await new TestFlow(adapter, async (turnContext) => { var state = turnContext.GetConversationState<Dictionary>(); var dc = dialogs.CreateContext(turnContext, state); await dc.Continue(); if (!turnContext.Responded) { await dc.Begin("test"); } }) .Send("Hello") .AssertReply("Welcome! We need to ask a few questions to get started.") .AssertReply("What's your name?") .Send("Paul") .AssertReply("Thanks Paul!") .StartTest(); }
A couple of points to note, you have to send a message to start the flow, and make sure you call turnContext.GetConversationState rather than using a local version of the state.
Edit – you may want to also look at Automate Bot tests with saved transcript files , Testing using ConfigurationManager with .net core and How to write a unit test for Bot Framework v4