Bot Builder v4.5 단위 테스트 : 대화 상자 클래스 테스트 - DateResolverDialog

지난번은 CancelAndHelpDialog 테스트를 살펴 보았지만 이번에는 DateResolverDialog 테스트를 살펴 보겠습니다.

DateResolverDialog



이 대화 상자에서는 날짜별로 특화된 유효성 검사를 수행합니다.

그럼 조속히 테스트를 보겠습니다. 테스트는 하나뿐입니다.

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

테스트 탐색기에서 확인하면 각 결과가 표시됩니다.


요약



DataMember가 나오는 것은 두번째 때문에 조금 익숙했다고 생각합니다. 다음번은 시리즈의 최종회로, 컨트롤러의 테스트와 정리입니다.

다음 기사로
목차 페이지로 돌아가기

좋은 웹페이지 즐겨찾기