Aracılığıyla paylaş


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

Ç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 DialogTestClienttü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 , , InputHintChannelDatavb. gibi Speakdiğ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 BookingDialogiletir.

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 MainDialogolduğ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:

Example middleware output from XUnit.

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.

Example test results for in-line data.

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ı IXunitSerializablegerektirir. Bot.Builder.Testing çerçevesi bu arabirimi uygulayan bir TestDataObject sınıf sağlar ve test çalışması verilerini uygulamak IXunitSerializablezorunda 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:

Example results for the booking dialog.

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

Ek bilgiler