如何使用提示单元测试Microsoft bot对话框

时间:2017-03-21 11:20:15

标签: c# unit-testing botframework

我正在使用Microsofts 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”,如果它的错误是“抱歉”。

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

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

1 个答案:

答案 0 :(得分:4)

了解如何单元测试对话框的一个很好的来源是来自Microsoft.Bot.Sample.TestsBotBuilder GitHub repository项目。

在那里,您将找到Bot Framework团队进行单元测试的方式。 EchoBotTests是最简单的开始。它显示了如何使用模拟连接器工厂向机器人发送消息并获取响应。

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