如何使用提示对 Microsoft 机器人对话框进行单元测试
How to unit test a Microsoft bot dialog with a prompt
我正在使用 Microsoft 的 Bot Framework 并尝试对我拥有的对话框进行单元测试(单独):
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);
}
}
我想证明,如果 IAwaitable 结果为真,它会回复 "Awesome",如果为假,则回复 "Sorry"。
PromptDialog 是一个 class 带有静态方法 Confirm
在成功使用 moq 模拟传递到对话框中的 IMessageActivity 和 IDialogContext 之前,我对对话框进行了单元测试。这感觉比较复杂,因为我想模拟一个对话框的状态。
到目前为止:
[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"));
}
}
有人对如何执行此操作有任何建议或想法吗?
了解如何对对话框进行单元测试的一个很好的来源是 Microsoft.Bot.Sample.Tests project from the BotBuilder GitHub repository。
在那里您会发现 Bot Framework 团队进行单元测试的方式。 EchoBotTests 是最容易上手的。它展示了如何使用模拟连接器工厂向机器人发送消息并获得响应。
关键是继承自DialogTestBase,它提供了非常有用的辅助方法。
我正在使用 Microsoft 的 Bot Framework 并尝试对我拥有的对话框进行单元测试(单独):
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);
}
}
我想证明,如果 IAwaitable 结果为真,它会回复 "Awesome",如果为假,则回复 "Sorry"。
PromptDialog 是一个 class 带有静态方法 Confirm
在成功使用 moq 模拟传递到对话框中的 IMessageActivity 和 IDialogContext 之前,我对对话框进行了单元测试。这感觉比较复杂,因为我想模拟一个对话框的状态。
到目前为止:
[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"));
}
}
有人对如何执行此操作有任何建议或想法吗?
了解如何对对话框进行单元测试的一个很好的来源是 Microsoft.Bot.Sample.Tests project from the BotBuilder GitHub repository。
在那里您会发现 Bot Framework 团队进行单元测试的方式。 EchoBotTests 是最容易上手的。它展示了如何使用模拟连接器工厂向机器人发送消息并获得响应。
关键是继承自DialogTestBase,它提供了非常有用的辅助方法。