Como testar a unidade de um diálogo de bot da Microsoft com um prompt
Estou usando o Microsofts Bot Framework e estou tentando testar unitariamente (isoladamente) uma caixa de diálogo que possuo:
public class MyDialog : IDialog
{
public async Task StartAsync(IDialogContext context)
{
PromptDialog.Confirm(context, MessageReceived, "Are you sure?", "Sorry what was that?");
}
private async Task MessageReceived(IDialogContext context, IAwaitable<bool> result)
{
bool isSure = await result;
string response = isSure ? "Awesome" : "Sorry";
IMessageActivity messageActivity = context.MakeMessage();
messageActivity.Text = response;
await context.PostAsync(messageActivity);
context.Done<object>(null);
}
}
Quero provar que, se o resultado IAwaitable for verdadeiro, ele responderá com "Awesome" e, se falso, será "Sorry".
PromptDialog é uma classe com um método estáticoconfirme
Eu tenho caixas de diálogo testadas antes de usar o moq para simular o IMessageActivity e o IDialogContext que são passados para o diálogo. Isso parece mais complicado porque quero zombar de um estado da caixa de diálogo.
Tão longe:
[TestFixture]
public class Tests
{
private Mock<IDialogContext> _dialogContext;
private Mock<IMessageActivity> _messageActivity;
private MyDialog _myDialog;
[SetUp]
public void Setup()
{
_dialogContext = new Mock<IDialogContext>();
_messageActivity = new Mock<IMessageActivity>();
_messageActivity.SetupAllProperties();
_dialogContext.SetupSequence(x => x.MakeMessage())
.Returns(_messageActivity.Object);
_myDialog = new MyDialog();
}
[Test]
public void GivenTrue_WhenIConfirmPrompt_ThenAwesome()
{
_myDialog
.StartAsync(_dialogContext.Object)
.Wait(CancellationToken.None);
Assert.That(_messageActivity.Object.Text, Is.EqualTo("Awesome"));
}
[Test]
public void GivenTrue_WhenIRejectPrompt_ThenSorry()
{
_myDialog
.StartAsync(_dialogContext.Object)
.Wait(CancellationToken.None);
Assert.That(_messageActivity.Object.Text, Is.EqualTo("Sorry"));
}
}
Alguém tem alguma sugestão ou idéia de como fazer isso?