【问题标题】:How to unit test a Microsoft bot dialog with a prompt如何使用提示对 Microsoft bot 对话框进行单元测试
【发布时间】:2017-08-13 00:44:50
【问题描述】:

我正在使用 Microsoft 的 Bot Framework,并且正在尝试对我拥有的 Dialog 进行单元测试(隔离):

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"));
    }
}

有人对如何做到这一点有任何建议或想法吗?

【问题讨论】:

  • 你在这里测试什么?我只看到模拟,没有看到真实的对象
  • 抱歉,已添加到测试类中
  • 什么是PromptDialog.Confirm? PromptDialog 是静态的吗,你能模拟一下吗,...?
  • 它是一个带有静态方法的类

标签: c# unit-testing botframework


【解决方案1】:

了解如何对对话框进行单元测试的一个很好的来源是来自BotBuilder GitHub repositoryMicrosoft.Bot.Sample.Tests 项目。

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

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

【讨论】:

  • @Ezequil Jalib : Node SDK 有没有类似的方法?
  • 我只是用我的知识回答了你的问题。
  • 不幸的是,样本似乎与框架不同步;目前样品测试不起作用。在 3.8 版之后,发生了阻止基类编译的重大更改。
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2014-05-21
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多