LoginSignup
0
0

More than 3 years have passed since last update.

Bot Builder v4.5 のユニットテスト : ダイアログクラスのテスト - DateResolverDialog

Last updated at Posted at 2019-11-18

前回 は CancelAndHelpDialog のテストを見ていきましたが、今回は DateResolverDialog のテストを見ていきます。

DateResolverDialog

このダイアログでは、日付に特化した検証を行います。

では早速テストを見ていきます。テストは 1 つだけです。

CancelAndHelpDialog テスト

このテストでは様々な日付のパターンでテストを行います。

DateResolverDialogTests.cs
[Theory]
[MemberData(nameof(DateResolverDialogTestsDataGenerator.DateResolverCases), MemberType = typeof(DateResolverDialogTestsDataGenerator))]
public async Task DialogFlowTests(TestDataObject testData)
{
    // Arrange
    var testCaseData = testData.GetObject<DateResolverDialogTestCase>();
    var sut = new DateResolverDialog();
    var testClient = new DialogTestClient(Channels.Test, sut, testCaseData.InitialData, new[] { new XUnitDialogTestLogger(Output) });

    // Execute the test case
    Output.WriteLine($"Test Case: {testCaseData.Name}");
    Output.WriteLine($"\r\nDialog Input: {testCaseData.InitialData}");
    for (var i = 0; i < testCaseData.UtterancesAndReplies.GetLength(0); i++)
    {
        var reply = await testClient.SendActivityAsync<IMessageActivity>(testCaseData.UtterancesAndReplies[i, 0]);
        Assert.Equal(testCaseData.UtterancesAndReplies[i, 1], reply?.Text);
    }

    Output.WriteLine($"\r\nDialog result: {testClient.DialogTurnResult.Result}");
    Assert.Equal(testCaseData.ExpectedResult, testClient.DialogTurnResult.Result);
}

テストパターンの作成

今回は BookingDialog のテスト 同様 MemberData 属性を使ってテストを取得しています。

DateResolverDialogTestsDataGenerator クラス

テストは DateResolverDialogTestsDataGenerator の BuildTestCaseObject メソッドでテスト用のデータを作成しています。

csharp:DateResolverDialogTestsDataGenerator .cs
private static object[] BuildTestCaseObject(string testCaseName, string input, string[,] utterancesAndReplies, string result)
{
var testData = new DateResolverDialogTestCase
{
Name = testCaseName,
InitialData = input,
ExpectedResult = result,
UtterancesAndReplies = utterancesAndReplies,
};
return new object[] { new TestDataObject(testData) };
}

また MemberData で指定されている DateResolverCases メソッドにて、複数のテストオブジェクトを作成しています。

public static IEnumerable<object[]> DateResolverCases()
        {
            yield return BuildTestCaseObject(
                "tomorrow",
                null,
                new[,]
                {
                    { "hi", "When would you like to travel?" },
                    { "tomorrow", null },
                },
                $"{DateTime.Now.AddDays(1):yyyy-MM-dd}");

//以下省略

初めのテストケースは以下のようになっています。

名前
"tomorrow"
初めに渡される日付文字列
null
会話
{ "hi", "When would you like to travel?" },
{ "tomorrow", null },
会話の結果作成された日付
$"{DateTime.Now.AddDays(1):yyyy-MM-dd}");

これは LUIS で必要な日付が取得できなかった場合に、ユーザーが "tomorrow" と日付を指定した場合のフローであることが分かります。
同様に他のテストケースも確認してください。

テストの実行と結果の確認

作成したテストケースデータを使って DialogTestClinet を作成します。

// Arrange
var testCaseData = testData.GetObject<DateResolverDialogTestCase>();
var sut = new DateResolverDialog();
var testClient = new DialogTestClient(Channels.Test, sut, testCaseData.InitialData, new[] { new XUnitDialogTestLogger(Output) });

次に指定された会話を最後まで実行します。

for (var i = 0; i < testCaseData.UtterancesAndReplies.GetLength(0); i++)
{
    var reply = await testClient.SendActivityAsync<IMessageActivity>(testCaseData.UtterancesAndReplies[i, 0]);
    Assert.Equal(testCaseData.UtterancesAndReplies[i, 1], reply?.Text);
}

最後に日付を確認します。

Output.WriteLine($"\r\nDialog result: {testClient.DialogTurnResult.Result}");
Assert.Equal(testCaseData.ExpectedResult, testClient.DialogTurnResult.Result);

テストエクスプローラーで確認すると、それぞれの結果が出ます。
image.png

まとめ

DataMember が出てくるのは 2 度目のため少し慣れたと思います。次回はシリーズの最終回で、コントローラーのテストとまとめです。

次の記事へ
目次へ戻る

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0