Test botlarını birim olarak kullanma
ŞUNLAR IÇIN GEÇERLIDIR: SDK v4
Bu konuda size aşağıdakilerin nasıl yapılacağını göstereceğiz:
- Botlar için birim testleri oluşturun.
- Bir iletişim kutusu tarafından döndürülen etkinlikleri beklenen değerlere karşı çevirmek için assert komutunu kullanın.
- bir iletişim kutusu tarafından döndürülen sonuçları denetlemek için assert kullanın.
- Farklı veri temelli test türleri oluşturun.
- İletişim kutusunun farklı bağımlılıkları için dil tanıyıcılar gibi sahte nesneler oluşturun.
Ön koşullar
Bu konuda kullanılan CoreBot Testleri örneği, birim testleri oluşturmak için Microsoft.Bot.Builder.Testing paketi, XUnit ve Moq'a başvurur.
Çekirdek bot örneği, kullanıcı amaçlarını tanımlamak için Language Understanding (LUIS) kullanır; ancak bu makalenin odak noktası kullanıcı amacını belirlemek değildir. Kullanıcı amaçlarını belirleme hakkında bilgi için bkz . Doğal dil anlama ve Botunuza doğal dil anlama ekleme.
Dekont
Language Understanding (LUIS) 1 Ekim 2025'te kullanımdan kaldırılacaktır. 1 Nisan 2023'e kadar yeni LUIS kaynakları oluşturamayacaksınız. Dil anlamanın daha yeni bir sürümü artık Azure AI Dili'nin bir parçası olarak kullanılabilir.
Azure AI Dili'nin bir özelliği olan konuşma dili anlama (CLU), LUIS'in güncelleştirilmiş sürümüdür. Bot Framework SDK'sında dil anlama desteği hakkında daha fazla bilgi için bkz . Doğal dil anlama.
Test İletişim Kutuları
CoreBot örneğinde, iletişim kutuları sınıf üzerinden DialogTestClient
birim testi yapılır ve bu da botun dışında ve kodunuzu bir web hizmetine dağıtmak zorunda kalmadan bunları yalıtarak test etmek için bir mekanizma sağlar.
Bu sınıfı kullanarak, iletişim kutularının yanıtlarını sırayla doğrulayan birim testleri yazabilirsiniz. sınıfını kullanan DialogTestClient
birim testleri, botbuilder iletişim kutusu kitaplığı kullanılarak oluşturulan diğer iletişim kutularıyla çalışmalıdır.
Aşağıdaki örnekte, 'den DialogTestClient
türetilen testler gösterilmektedir:
var sut = new BookingDialog();
var testClient = new DialogTestClient(Channels.Msteams, sut);
var reply = await testClient.SendActivityAsync<IMessageActivity>("hi");
Assert.Equal("Where would you like to travel to?", reply.Text);
reply = await testClient.SendActivityAsync<IMessageActivity>("Seattle");
Assert.Equal("Where are you traveling from?", reply.Text);
reply = await testClient.SendActivityAsync<IMessageActivity>("New York");
Assert.Equal("When would you like to travel?", reply.Text);
reply = await testClient.SendActivityAsync<IMessageActivity>("tomorrow");
Assert.Equal("OK, I will book a flight from Seattle to New York for tomorrow, Is this Correct?", reply.Text);
reply = await testClient.SendActivityAsync<IMessageActivity>("yes");
Assert.Equal("Sure thing, wait while I finalize your reservation...", reply.Text);
reply = testClient.GetNextReply<IMessageActivity>();
Assert.Equal("All set, I have booked your flight to Seattle for tomorrow", reply.Text);
DialogTestClient
sınıfı ad alanında Microsoft.Bot.Builder.Testing
tanımlanır ve Microsoft.Bot.Builder.Testing NuGet paketine dahil edilir.
DialogTestClient
öğesinin DialogTestClient
ilk parametresi hedef kanaldır. Bu, botunuzun hedef kanalını (Teams, Slack vb.) temel alarak farklı işleme mantığını test etmenizi sağlar. Hedef kanalınızdan emin değilseniz veya Test
kanal kimliklerini kullanabilirsinizEmulator
, ancak bazı bileşenlerin geçerli kanala bağlı olarak farklı davranabileceğini unutmayın; örneğin, ConfirmPrompt
ve Emulator
kanalları için Test
Evet/Hayır seçeneklerini farklı işler. Bu parametreyi, iletişim kutunuzda kanal kimliğine göre koşullu işleme mantığını test etmek için de kullanabilirsiniz.
İkinci parametre, test edilen iletişim kutusunun bir örneğidir. Bu makaledeki örnek kodda, sut
test altındaki sistemi temsil eder.
Oluşturucu, DialogTestClient
istemci davranışını daha fazla özelleştirmenize veya gerekirse test edilen iletişim kutusuna parametre geçirmenize olanak sağlayan ek parametreler sağlar. İletişim kutusu için başlatma verilerini geçirebilir, özel ara yazılım ekleyebilir veya kendi TestAdapter ve ConversationState
örneğinizi kullanabilirsiniz.
İleti gönderme ve alma
yöntemi, SendActivityAsync<IActivity>
iletişim kutunuza bir metin ifadesi veya konuşma IActivity
göndermenize olanak tanır ve aldığı ilk iletiyi döndürür. <T>
parametresi, göndermeye gerek kalmadan onaylamanız için yanıtın güçlü türde bir örneğini döndürmek için kullanılır.
var reply = await testClient.SendActivityAsync<IMessageActivity>("hi");
Assert.Equal("Where would you like to travel to?", reply.Text);
Bazı senaryolarda botunuz tek bir etkinliğe yanıt olarak birkaç ileti gönderebilir, bu durumlarda DialogTestClient
yanıtları kuyruğa alır ve yanıt kuyruğundan sonraki iletiyi açmak için yöntemini kullanabilirsiniz GetNextReply<IActivity>
.
reply = testClient.GetNextReply<IMessageActivity>();
Assert.Equal("All set, I have booked your flight to Seattle for tomorrow", reply.Text);
GetNextReply<IActivity>
yanıt kuyruğunda başka ileti yoksa null döndürür.
Onaylama etkinlikleri
CoreBot örneğindeki kod yalnızca döndürülen etkinliklerin özelliğini onaylar Text
. Daha karmaşık botlarda , , InputHint
ChannelData
vb. gibi Speak
diğer özellikleri onaylamanız gerekebilir.
Assert.Equal("Sure thing, wait while I finalize your reservation...", reply.Text);
Assert.Equal("One moment please...", reply.Speak);
Assert.Equal(InputHints.IgnoringInput, reply.InputHint);
Yukarıda gösterildiği gibi her özelliği tek tek denetleyerek bunu yapabilirsiniz, etkinlikleri onaylamaya yönelik kendi yardımcı yardımcı programlarınızı yazabilir veya fluentAssertions gibi diğer çerçeveleri kullanarak özel onaylar yazabilir ve test kodunuzu basitleştirebilirsiniz.
parametreleri iletişim kutularınıza geçirme
Oluşturucunun DialogTestClient
, iletişim kutunuza parametre geçirmek için kullanılabilecek bir initialDialogOptions
değeri vardır. Örneğin, MainDialog
bu örnekte, dil tanıma sonuçlarından bir BookingDetails
nesne başlatır ve kullanıcının konuşmasından çözümlediğinden varlıklarla bu nesneyi çağrısına BookingDialog
iletir.
Bunu bir testte aşağıdaki gibi uygulayabilirsiniz:
var inputDialogParams = new BookingDetails()
{
Destination = "Seattle",
TravelDate = $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}"
};
var sut = new BookingDialog();
var testClient = new DialogTestClient(Channels.Msteams, sut, inputDialogParams);
BookingDialog
bu parametreyi alır ve testte dosyasından çağrıldığında MainDialog
olduğu gibi bu parametreye erişir.
private async Task<DialogTurnResult> DestinationStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
var bookingDetails = (BookingDetails)stepContext.Options;
...
}
Onaylayan iletişim kutusu sonuçları döndür
Gibi bazı iletişim kutuları BookingDialog
veya DateResolverDialog
arama iletişim kutusuna bir değer döndürür. nesnesi, DialogTestClient
iletişim kutusu tarafından döndürülen sonuçları çözümlemek ve onaylamak için kullanılabilecek bir DialogTurnResult
özelliği kullanıma sunar.
Örnek:
var sut = new BookingDialog();
var testClient = new DialogTestClient(Channels.Msteams, sut);
var reply = await testClient.SendActivityAsync<IMessageActivity>("hi");
Assert.Equal("Where would you like to travel to?", reply.Text);
...
var bookingResults = (BookingDetails)testClient.DialogTurnResult.Result;
Assert.Equal("New York", bookingResults?.Origin);
Assert.Equal("Seattle", bookingResults?.Destination);
Assert.Equal("2019-06-21", bookingResults?.TravelDate);
özelliği, DialogTurnResult
şelaledeki adımlar tarafından döndürülen ara sonuçları incelemek ve onaylamak için de kullanılabilir.
Test çıkışını analiz etme
Bazen testte hata ayıklamak zorunda kalmadan test yürütmesini analiz etmek için birim testi transkriptini okumak gerekir.
Microsoft.Bot.Builder.Testing paketi, iletişim kutusu tarafından gönderilen ve alınan iletileri konsola kaydeden bir XUnitDialogTestLogger
içerir.
Bu ara yazılımı kullanmak için testinizin XUnit test çalıştırıcısı tarafından sağlanan bir nesneyi alan bir ITestOutputHelper
oluşturucuyu kullanıma sunması ve parametresi aracılığıyla geçirilecek DialogTestClient
bir XUnitDialogTestLogger
oluşturması middlewares
gerekir.
public class BookingDialogTests
{
private readonly IMiddleware[] _middlewares;
public BookingDialogTests(ITestOutputHelper output)
: base(output)
{
_middlewares = new[] { new XUnitDialogTestLogger(output) };
}
[Fact]
public async Task SomeBookingDialogTest()
{
// Arrange
var sut = new BookingDialog();
var testClient = new DialogTestClient(Channels.Msteams, sut, middlewares: _middlewares);
...
}
}
Aşağıda, yapılandırıldığında çıkış penceresindeki günlüklerin bir XUnitDialogTestLogger
örneği verilmiştir:
XUnit kullanırken konsola test çıkışı gönderme hakkında ek bilgi için XUnit belgelerindeki Çıktı yakalama bölümüne bakın.
Bu çıkış, sürekli tümleştirme derlemeleri sırasında derleme sunucusunda da günlüğe kaydedilir ve derleme hatalarını çözümlemenize yardımcı olur.
Veri Temelli Testler
Çoğu durumda iletişim kutusu mantığı değişmez ve konuşmadaki farklı yürütme yolları kullanıcı konuşmalarını temel alır. Konuşmadaki her değişken için tek bir birim testi yazmak yerine veri temelli testleri (parametreli test olarak da bilinir) kullanmak daha kolaydır.
Örneğin, bu belgenin genel bakış bölümündeki örnek test, bir yürütme akışının nasıl test yapılacağını gösterir, ancak aşağıdakiler gibi başkalarını test etmez:
- Kullanıcı onay için hayır derse ne olur?
- Farklı bir tarih kullanırlarsa ne olur?
Veri temelli testler, testleri yeniden yazmak zorunda kalmadan tüm bu permütasyonları test etmemizi sağlar.
CoreBot örneğinde, testleri parametreleştirmek için XUnit testlerini kullanırız Theory
.
InlineData kullanarak teori testleri
Aşağıdaki test, kullanıcı "iptal et" dediğinde bir iletişim kutusunun iptal edileceğini denetler.
[Fact]
public async Task ShouldBeAbleToCancel()
{
var sut = new TestCancelAndHelpDialog();
var testClient = new DialogTestClient(Channels.Test, sut);
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>("cancel");
Assert.Equal("Cancelling...", reply.Text);
}
Bir iletişim kutusunu iptal etmek için kullanıcılar "çık", "boş ver" ve "durdur" yazabilir. Her olası sözcük için yeni bir test çalışması yazmak yerine, her test çalışması için parametreleri tanımlamak üzere bir değer listesi InlineData
aracılığıyla parametreleri kabul eden tek Theory
bir test yöntemi yazın:
[Theory]
[InlineData("cancel")]
[InlineData("quit")]
[InlineData("never mind")]
[InlineData("stop it")]
public async Task ShouldBeAbleToCancel(string cancelUtterance)
{
var sut = new TestCancelAndHelpDialog();
var testClient = new DialogTestClient(Channels.Test, sut, middlewares: _middlewares);
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);
}
Yeni test farklı parametrelerle dört kez yürütülür ve her çalışma Visual Studio Test Gezgini'ndeki test kapsamında ShouldBeAbleToCancel
bir alt öğe olarak gösterilir. Aşağıda gösterildiği gibi herhangi biri başarısız olursa, tüm test kümesini yeniden çalıştırmak yerine sağ tıklayıp başarısız olan senaryonun hatalarını ayıklayabilirsiniz.
MemberData ve karmaşık türleri kullanan teori testleri
InlineData
basit değer türü parametreleri (dize, int vb.) alan küçük veri temelli testler için kullanışlıdır.
bir BookingDialog
BookingDetails
nesnesi alır ve yeni BookingDetails
bir nesne döndürür. Bu iletişim kutusu için bir testin parametrelenmemiş bir sürümü aşağıdaki gibi görünür:
[Fact]
public async Task DialogFlow()
{
// Initial parameters
var initialBookingDetails = new BookingDetails
{
Origin = "Seattle",
Destination = null,
TravelDate = null,
};
// Expected booking details
var expectedBookingDetails = new BookingDetails
{
Origin = "Seattle",
Destination = "New York",
TravelDate = "2019-06-25",
};
var sut = new BookingDialog();
var testClient = new DialogTestClient(Channels.Test, sut, initialBookingDetails);
// Act/Assert
var reply = await testClient.SendActivityAsync<IMessageActivity>("hi");
...
var bookingResults = (BookingDetails)testClient.DialogTurnResult.Result;
Assert.Equal(expectedBookingDetails.Origin, bookingResults?.Origin);
Assert.Equal(expectedBookingDetails.Destination, bookingResults?.Destination);
Assert.Equal(expectedBookingDetails.TravelDate, bookingResults?.TravelDate);
}
Bu testi parametreleştirmek için test çalışması verilerimizi içeren bir BookingDialogTestCase
sınıf oluşturduk. İlk nesnesini, bekleneni BookingDetails
ve kullanıcıdan gönderilen konuşmaları ve her dönüş için iletişim kutusundan beklenen yanıtları içeren dize dizisini içerirBookingDetails
.
public class BookingDialogTestCase
{
public BookingDetails InitialBookingDetails { get; set; }
public string[,] UtterancesAndReplies { get; set; }
public BookingDetails ExpectedBookingDetails { get; set; }
}
Ayrıca, test tarafından kullanılacak test çalışmalarının koleksiyonunu döndüren bir yöntemi kullanıma IEnumerable<object[]> BookingFlows()
sunan bir yardımcı BookingDialogTestsDataGenerator
sınıfı da oluşturduk.
Her test çalışmasını Visual Studio Test Gezgini'nde ayrı bir öğe olarak görüntülemek için XUnit test çalıştırıcısı, bunu basitleştirmek için gibi karmaşık türlerin BookingDialogTestCase
uygulamasını IXunitSerializable
gerektirir. Bot.Builder.Testing çerçevesi bu arabirimi uygulayan bir TestDataObject
sınıf sağlar ve test çalışması verilerini uygulamak IXunitSerializable
zorunda kalmadan sarmalamak için kullanılabilir.
İki sınıfın nasıl kullanıldığını gösteren bir parçası IEnumerable<object[]> BookingFlows()
aşağıdadır:
public static class BookingDialogTestsDataGenerator
{
public static IEnumerable<object[]> BookingFlows()
{
// Create the first test case object
var testCaseData = new BookingDialogTestCase
{
InitialBookingDetails = new BookingDetails(),
UtterancesAndReplies = new[,]
{
{ "hi", "Where would you like to travel to?" },
{ "Seattle", "Where are you traveling from?" },
{ "New York", "When would you like to travel?" },
{ "tomorrow", $"Please confirm, I have you traveling to: Seattle from: New York on: {DateTime.Now.AddDays(1):yyyy-MM-dd}. Is this correct? (1) Yes or (2) No" },
{ "yes", null },
},
ExpectedBookingDetails = new BookingDetails
{
Destination = "Seattle",
Origin = "New York",
TravelDate = $"{DateTime.Now.AddDays(1):yyyy-MM-dd}",
},
};
// wrap the test case object into TestDataObject and return it.
yield return new object[] { new TestDataObject(testCaseData) };
// Create the second test case object
testCaseData = new BookingDialogTestCase
{
InitialBookingDetails = new BookingDetails
{
Destination = "Seattle",
Origin = "New York",
TravelDate = null,
},
UtterancesAndReplies = new[,]
{
{ "hi", "When would you like to travel?" },
{ "tomorrow", $"Please confirm, I have you traveling to: Seattle from: New York on: {DateTime.Now.AddDays(1):yyyy-MM-dd}. Is this correct? (1) Yes or (2) No" },
{ "yes", null },
},
ExpectedBookingDetails = new BookingDetails
{
Destination = "Seattle",
Origin = "New York",
TravelDate = $"{DateTime.Now.AddDays(1):yyyy-MM-dd}",
},
};
// wrap the test case object into TestDataObject and return it.
yield return new object[] { new TestDataObject(testCaseData) };
}
}
Test verilerini ve bir test çalışması koleksiyonunu kullanıma sunan bir sınıfı depolamak için bir nesne oluşturduktan sonra, MemberData
InlineData
ilk parametresi MemberData
test çalışmalarının koleksiyonunu döndüren statik işlevin adı ve ikinci parametre de bu yöntemi kullanıma sunan sınıfın türüdür.
[Theory]
[MemberData(nameof(BookingDialogTestsDataGenerator.BookingFlows), MemberType = typeof(BookingDialogTestsDataGenerator))]
public async Task DialogFlowUseCases(TestDataObject testData)
{
// Get the test data instance from TestDataObject
var bookingTestData = testData.GetObject<BookingDialogTestCase>();
var sut = new BookingDialog();
var testClient = new DialogTestClient(Channels.Test, sut, bookingTestData.InitialBookingDetails);
// Iterate over the utterances and replies array.
for (var i = 0; i < bookingTestData.UtterancesAndReplies.GetLength(0); i++)
{
var reply = await testClient.SendActivityAsync<IMessageActivity>(bookingTestData.UtterancesAndReplies[i, 0]);
Assert.Equal(bookingTestData.UtterancesAndReplies[i, 1], reply?.Text);
}
// Assert the resulting BookingDetails object
var bookingResults = (BookingDetails)testClient.DialogTurnResult.Result;
Assert.Equal(bookingTestData.ExpectedBookingDetails?.Origin, bookingResults?.Origin);
Assert.Equal(bookingTestData.ExpectedBookingDetails?.Destination, bookingResults?.Destination);
Assert.Equal(bookingTestData.ExpectedBookingDetails?.TravelDate, bookingResults?.TravelDate);
}
Test yürütülürken Visual Studio Test Gezgini'ndeki testlerin sonuçlarının DialogFlowUseCases
bir örneği aşağıda verilmiştir:
Sahteleri Kullanma
Şu anda test edilmiş olmayan öğeler için sahte öğeleri kullanabilirsiniz. Başvuru için bu düzey genellikle birim ve tümleştirme testi olarak düşünülebilir.
Mümkün olduğunca çok öğeyi taklit ederek test ettiğiniz parçanın daha iyi yalıtılmasını sağlayabilirsiniz. Sahte öğeler için adaylar depolama, bağdaştırıcı, ara yazılım, etkinlik işlem hattı, kanallar ve botunuzun doğrudan parçası olmayan diğer öğeleri içerir. Bu, her bir parçayı yalıtmak için botunuzun test ettiğiniz parçasına dahil olmayan ara yazılım gibi belirli özellikleri geçici olarak kaldırmayı da içerebilir. Ancak ara yazılımınızı test ediyorsanız bunun yerine botunuzla dalga geçmek isteyebilirsiniz.
Sahte öğeler, bir öğeyi bilinen farklı bir nesneyle değiştirmekten en düşük merhaba dünya işlevini uygulamaya kadar çeşitli formlar alabilir. Bu, gerekli değilse öğeyi kaldırma veya hiçbir şey yapmaya zorlama biçimini de alabilir.
Sahteler, veritabanları, dil modelleri veya diğer nesneler gibi dış kaynaklara güvenmek zorunda kalmadan bir iletişim kutusunun bağımlılıklarını yapılandırmamıza ve testin yürütülmesi sırasında bilinen bir durumda olduklarından emin olmamıza olanak tanır.
İletişim kutunuzu dış nesnelere bağımlılıklarını test etmek ve azaltmak için, dış bağımlılıkları iletişim kutusu oluşturucusunda eklemeniz gerekebilir.
Örneğin, içinde MainDialog
örnek oluşturma BookingDialog
yerine:
public MainDialog()
: base(nameof(MainDialog))
{
...
AddDialog(new BookingDialog());
...
}
Bir örneğini BookingDialog
oluşturucu parametresi olarak geçiririz:
public MainDialog(BookingDialog bookingDialog)
: base(nameof(MainDialog))
{
...
AddDialog(bookingDialog);
...
}
Bu, örneğini BookingDialog
sahte bir nesneyle değiştirmemize ve gerçek BookingDialog
sınıfı çağırmak zorunda kalmadan için MainDialog
birim testleri yazmamıza olanak tanır.
// Create the mock object
var mockDialog = new Mock<BookingDialog>();
// Use the mock object to instantiate MainDialog
var sut = new MainDialog(mockDialog.Object);
var testClient = new DialogTestClient(Channels.Test, sut);
Sahte İletişim Kutuları
Yukarıda açıklandığı gibi, MainDialog
nesnesini almak BookingDetails
için çağırırBookingDialog
. Sahte örneğini BookingDialog
aşağıdaki gibi uygulayıp yapılandırıyoruz:
// Create the mock object for BookingDialog.
var mockDialog = new Mock<BookingDialog>();
mockDialog
.Setup(x => x.BeginDialogAsync(It.IsAny<DialogContext>(), It.IsAny<object>(), It.IsAny<CancellationToken>()))
.Returns(async (DialogContext dialogContext, object options, CancellationToken cancellationToken) =>
{
// Send a generic activity so we can assert that the dialog was invoked.
await dialogContext.Context.SendActivityAsync($"{mockDialogNameTypeName} mock invoked", cancellationToken: cancellationToken);
// Create the BookingDetails instance we want the mock object to return.
var expectedBookingDialogResult = new BookingDetails()
{
Destination = "Seattle",
Origin = "New York",
TravelDate = $"{DateTime.UtcNow.AddDays(1):yyyy-MM-dd}"
};
// Return the BookingDetails we need without executing the dialog logic.
return await dialogContext.EndDialogAsync(expectedBookingDialogResult, cancellationToken);
});
// Create the sut (System Under Test) using the mock booking dialog.
var sut = new MainDialog(mockDialog.Object);
Bu örnekte, Moq'u kullanarak sahte iletişim kutusunu ve Setup
davranışını yapılandırmak için ve Returns
yöntemlerini oluşturduk.
SAHTE LUIS sonuçları
Dekont
Language Understanding (LUIS) 1 Ekim 2025'te kullanımdan kaldırılacaktır. 1 Nisan 2023'e kadar yeni LUIS kaynakları oluşturamayacaksınız. Dil anlamanın daha yeni bir sürümü artık Azure AI Dili'nin bir parçası olarak kullanılabilir.
Azure AI Dili'nin bir özelliği olan konuşma dili anlama (CLU), LUIS'in güncelleştirilmiş sürümüdür. Bot Framework SDK'sında dil anlama desteği hakkında daha fazla bilgi için bkz . Doğal dil anlama.
Basit senaryolarda, kod aracılığıyla aşağıdaki gibi sahte LUIS sonuçları uygulayabilirsiniz:
var mockRecognizer = new Mock<IRecognizer>();
mockRecognizer
.Setup(x => x.RecognizeAsync<FlightBooking>(It.IsAny<ITurnContext>(), It.IsAny<CancellationToken>()))
.Returns(() =>
{
var luisResult = new FlightBooking
{
Intents = new Dictionary<FlightBooking.Intent, IntentScore>
{
{ FlightBooking.Intent.BookFlight, new IntentScore() { Score = 1 } },
},
Entities = new FlightBooking._Entities(),
};
return Task.FromResult(luisResult);
});
LUIS sonuçları karmaşık olabilir. İstendiğinde, JSON dosyasında istenen sonucu yakalamak, projenize kaynak olarak eklemek ve luis sonucuna seri durumdan çıkarmak daha kolaydır. Bir örnek aşağıda verilmiştir:
var mockRecognizer = new Mock<IRecognizer>();
mockRecognizer
.Setup(x => x.RecognizeAsync<FlightBooking>(It.IsAny<ITurnContext>(), It.IsAny<CancellationToken>()))
.Returns(() =>
{
// Deserialize the LUIS result from embedded json file in the TestData folder.
var bookingResult = GetEmbeddedTestData($"{GetType().Namespace}.TestData.FlightToMadrid.json");
// Return the deserialized LUIS result.
return Task.FromResult(bookingResult);
});