Как выполнить модульный тест Отмена диалога, который возвращается к MainDialog с помощью диалога прерывания - PullRequest
2 голосов
/ 19 сентября 2019

Мы создаем бота, который имеет MainDialog и subdialog.Поддиалог наследуется от CancelAndHelpDialog.Мы хотим вернуться к MainDialog, когда набираем отмену в поддиалоге.Это все работает, но когда мы пытаемся выполнить модульное тестирование, этот тест выдает исключение:

System.Exception: DialogContext.BeginDialogAsync (): диалог с идентификатором «MainDialog» не былнашел.Диалог должен быть включен в текущий или родительский DialogSet.Например, при создании подкласса ComponentDialog вы можете вызвать AddDialog () в своем конструкторе.

Я настроил проект в git, который воспроизводит проблему:

https://github.com/Rufus1123/CancelReturnsToParentTestExample

Я взял шаблон CoreBotWithTests в качестве отправной точки.Сделанное мной изменение - CancelAndHelpDialog.Функция InteruptAsync теперь содержит

await innerDc.CancelAllDialogsAsync(cancellationToken);
return await innerDc.ReplaceDialogAsync(nameof(MainDialog), null, cancellationToken: cancellationToken);

вместо

return await innerDc.CancelAllDialogsAsync(cancellationToken);

в случае «отмена» и «выход»

Как следует из ошибки,MainDialog не может быть найдено, когда мы передаем subdialog в testclient.Мы попытались добавить MainDialog в набор в тесте:

var sut = new BookingDialog();
var sut.AddDialog(new MainDialog());
var testClient = new DialogTestClient(Channels.Test, sut, bookingTestData.InitialBookingDetails, _middlewares);

, но безрезультатно.MainDialog все еще не может быть найден

То, как мы сейчас проверяем, возвращается ли каждое диалоговое окно к MainDialog, начинается с main (передавая mainDialog в testClient), затем переходя к диалогу, который мы хотим протестировать(с высказываниями в DialogTestsDataGenerator) и, наконец, проверьте, действительно ли «отмена» возвращает MainDialog, и показывает начальное сообщение.Я ожидаю, что нам не понадобятся эти шаги, и мы только протестируем наш поддиалог, передав его тестирующему клиенту.Есть ли способ передать подчиненный диалог только тестовому клиенту, но все же проверить, возвращается ли он в MainDialog?

1 Ответ

0 голосов
/ 23 сентября 2019

Вы должны создать новый набор диалогов в вашем DialogBot и добавить свой MainDialog к этому набору диалогов, чтобы решить вашу проблему.

  Dialogs = new DialogSet(conversationState.CreateProperty<DialogState>(nameof(DialogBot<T>)));
  Dialogs.Add(new MainDialog());

Или просто измените код в "cancel" с

await innerDc.CancelAllDialogsAsync(cancellationToken);
return await innerDc.ReplaceDialogAsync(nameof(MainDialog), null, cancellationToken: cancellationToken);

до

return await innderDc.EndDialogAsync(nameof(YourSubDialog), cancellationToken);

, и в своем MainDialog завершите его с помощью этого кода, чтобы каждый раз, когда вы отменяете его, он закрывал поддиалог и возвращался к последнему шагу основного диалога, а последний шаг перезапускал главное диалоговое окно:

return await stepContext.ReplaceDialog(nameof(MainDialog), cancellationToken);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...