c# - 如何使用提示对 Microsoft 机器人对话框进行单元测试

标签 c# unit-testing botframework

我正在使用 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 是一个带有静态方法的类 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来自 BotBuilder GitHub repository 的项目.

在那里您会发现 Bot Framework 团队进行单元测试的方式。 EchoBotTests是最容易上手的。它展示了如何使用模拟的连接器工厂向机器人发送消息并获得响应。

关键是继承自DialogTestBase它提供了非常有用的辅助方法。

关于c# - 如何使用提示对 Microsoft 机器人对话框进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42925624/

相关文章:

.net-core - 机器人配置不包含 ID 为 `luis` 的服务类型 `basic-bot-LUIS` 。 (.NET 核心)

c# - C#:在Tuple中使用Task <>

c# - 在C#中将日期时间转换为显示毫秒

python - 如何单元测试 Flask websocket 服务器 (Flask-SocketIO)

java - 当前项目和插件组中的 Maven PITest 错误 "No plugin found for for prefix ' org.pitest'

c# - 在 Microsoft Bot Framework 中使用 FormFlow 的动态多个选择字段

c# - 为什么新特性 "binary literals"不是以0b开头,而是以0b开头?

c# - System.Net.Http.Formatting.dll 导致 Newtonsoft.Json 出现问题

django - 测试期间错误的 default_storage

node.js - 用于 NodeJS 的 Microsoft/Botbuilder : Bind URL Parameters to bot session