Мы создаем бота, который имеет 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?