前回 は CancelAndHelpDialog のテストを見ていきましたが、今回は DateResolverDialog のテストを見ていきます。
DateResolverDialog
このダイアログでは、日付に特化した検証を行います。
では早速テストを見ていきます。テストは 1 つだけです。
CancelAndHelpDialog テスト
このテストでは様々な日付のパターンでテストを行います。
[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 メソッドでテスト用のデータを作成しています。
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);
テストエクスプローラーで確認すると、それぞれの結果が出ます。
まとめ
DataMember が出てくるのは 2 度目のため少し慣れたと思います。次回はシリーズの最終回で、コントローラーのテストとまとめです。