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

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

CancelAndHelpDialog



이 대화 상자에서는 주로 다음을 수행합니다.
  • cancel, quit가 오면 현재 대화 상자를 취소합니다
  • help,?가 오면 도움말을 표시하고 대화 상자를 계속합니다.

    그럼 조속히 테스트를 보겠습니다.

    CancelAndHelpDialogTests 생성자



    CancelAndHelpDialogTests 클래스내에서 실행하는 테스트에 공통되는 것을 생성자 로 준비합니다.
    private readonly IMiddleware[] _middlewares;
    
    public CancelAndHelpDialogTests(ITestOutputHelper output)
        : base(output)
    {
        _middlewares = new IMiddleware[] { new XUnitDialogTestLogger(output) };
    }
    

    ShouldBeAbleToCancel 테스트



    이 테스트는 cancel 또는 quite가 지연된 경우 처리를 테스트합니다.

    CancelAndHelpDialogTests.cs
    [Theory]
    [InlineData("cancel")]
    [InlineData("quit")]
    public async Task ShouldBeAbleToCancel(string cancelUtterance)
    {
        var sut = new TestCancelAndHelpDialog();
        var testClient = new DialogTestClient(Channels.Test, sut, middlewares: _middlewares);
    
        // Execute the test case
        var reply = await testClient.SendActivityAsync<IMessageActivity>("Hi");
        Assert.Equal("Hi there", reply.Text);
        Assert.Equal(DialogTurnStatus.Waiting, testClient.DialogTurnResult.Status);
    
        reply = await testClient.SendActivityAsync<IMessageActivity>(cancelUtterance);
        Assert.Equal("Cancelling...", reply.Text);
        Assert.Equal(DialogTurnStatus.Complete, testClient.DialogTurnResult.Status);
    }
    

    테스트 패턴 만들기



    이번에도 Theory 테스트입니다만, 전회보다 패턴이 복잡하지 않기 때문에, InlineData 를 사용하고 있습니다.

    더미 대화



    취소 흐름을 시도하는 것이 목적이므로 실제로 사용하는 MainDialog 나 BookingDialog 대신 테스트를 위해 대화 상자를 만들었습니다.
    private class TestCancelAndHelpDialog : CancelAndHelpDialog
    {
        public TestCancelAndHelpDialog()
            : base(nameof(TestCancelAndHelpDialog))
        {
            AddDialog(new TextPrompt(nameof(TextPrompt)));
            var steps = new WaterfallStep[]
            {
                PromptStep,
                FinalStep,
            };
            AddDialog(new WaterfallDialog("testWaterfall", steps));
            InitialDialogId = "testWaterfall";
        }
    
        private async Task<DialogTurnResult> PromptStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Hi there") }, cancellationToken);
        }
    
        private Task<DialogTurnResult> FinalStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            throw new NotImplementedException();
        }
    }
    

    테스트 실행 및 결과 확인



    이번에도 DialogTestClient를 사용하여 테스트를 실행합니다. 테스트를 위해 준비한 TestCancelAndHelpDialog 대화 상자를 인스턴스화하고 먼저 "Hi"를 보내 대화를 시작합니다. 또한 대화 상자의 상태를 확인합니다.
    var sut = new TestCancelAndHelpDialog();
    var testClient = new DialogTestClient(Channels.Test, sut, middlewares: _middlewares);
    
    // Execute the test case
    var reply = await testClient.SendActivityAsync<IMessageActivity>("Hi");
    Assert.Equal("Hi there", reply.Text);
    Assert.Equal(DialogTurnStatus.Waiting, testClient.DialogTurnResult.Status);
    

    그런 다음 inlineData로 전달된 취소 구문을 보내 응답과 대화 상태를 확인합니다.
    reply = await testClient.SendActivityAsync<IMessageActivity>(cancelUtterance);
    Assert.Equal("Cancelling...", reply.Text);
    Assert.Equal(DialogTurnStatus.Complete, testClient.DialogTurnResult.Status);
    

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


    ShouldBeAbleToGetHelp 테스트



    기본 흐름은 동일하지만 테스트 실행 및 확인은 마지막 대화 상태가 Complete가 아닌 원래 대화를 계속 실행할 수 있는 상태인 Waiting인지 확인합니다.

    요약



    이번에는 더 간단한 테스트 케이스를 만드는 방법으로 InlineData를 사용하는 방법을 살펴 보았습니다. 이쪽의 기사를 먼저 하는 것이 좋았던 생각도 합니다만, 때 이미 늦었습니다. 다음에는 DateResolverDialog 테스트를 살펴 보겠습니다.

    다음 기사로
    목차 페이지로 돌아가기
  • 좋은 웹페이지 즐겨찾기