Megosztás a következőn keresztül:


Tesztrobotok egyesének használata

A KÖVETKEZŐKRE VONATKOZIK: SDK v4

Ebben a témakörben bemutatjuk, hogyan:

  • Egységtesztek létrehozása robotokhoz.
  • Az érvényesség használatával ellenőrizze, hogy a párbeszédpanel által visszaadott tevékenységek a várt értékekkel ellentétesek-e.
  • Az érvényesség használatával ellenőrizze a párbeszédpanel által visszaadott eredményeket.
  • Különböző típusú adatvezérelt tesztek létrehozása.
  • Hozzon létre mintaobjektumokat a párbeszédpanel különböző függőségeihez, például a nyelv felismerőihez stb.

Előfeltételek

A jelen témakörben használt CoreBot-tesztek mintája a Microsoft.Bot.Builder.Testing csomagra, az XUnitra és a Moq-ra hivatkozik az egységtesztek létrehozásához.

Az alapvető robotminta a Language Understanding (LUIS) használatával azonosítja a felhasználói szándékokat; A felhasználói szándék azonosítása azonban nem a jelen cikk középpontjában van. A felhasználói szándékok azonosításával kapcsolatos információkért tekintse meg a természetes nyelv megértését és a természetes nyelv megértésének hozzáadását a robothoz.

Megjegyzés:

A Language Understanding (LUIS) 2025. október 1-jén megszűnik. 2023. április 1-től nem hozhat létre új LUIS-erőforrásokat. Az Azure AI Language részeként már elérhető a nyelvértés újabb verziója.

Az Azure AI Language egyik funkciója, a beszélgetési nyelv megértése (CLU) a LUIS frissített verziója. További információ a Bot Framework SDK nyelvfelismerési támogatásáról: Természetes nyelvfelismerés.

Tesztelési párbeszédpanelek

A CoreBot-mintában a párbeszédpanelek tesztelése az DialogTestClient osztályon keresztül történik, amely lehetővé teszi, hogy a roboton kívül elkülönítve tesztelje őket, és anélkül, hogy a kódot egy webszolgáltatásban kellene üzembe helyeznie.

Ebben az osztályban olyan egységteszteket írhat, amelyek felváltva ellenőrzik a párbeszédpanelek válaszait. Az osztályt használó DialogTestClient egységteszteknek más, a robotépítő párbeszédpanelek kódtárával létrehozott párbeszédpanelekkel kell működnie.

Az alábbi példa a következőből DialogTestClientszármaztatott teszteket mutatja be:

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

Az DialogTestClient osztály a Microsoft.Bot.Builder.Testing névtérben van definiálva, és a Microsoft.Bot.Builder.Testing NuGet csomag része.

DialogTestClient

A célcsatorna első paramétere DialogTestClient . Ez lehetővé teszi, hogy a robot célcsatornája (Teams, Slack stb.) alapján tesztelje a különböző renderelési logikát. Ha bizonytalan a célcsatornával kapcsolatban, használhatja a Emulator vagy Test csatornaazonosítókat, de ne feledje, hogy egyes összetevők eltérően viselkedhetnek az aktuális csatornától függően, ConfirmPrompt például az Igen/Nem beállításokat másként jeleníti meg a csatornák és Emulator a Test csatornák esetében. Ezzel a paraméterel a feltételes renderelési logikát is tesztelheti a párbeszédpanelen a csatornaazonosító alapján.

A második paraméter a tesztelt párbeszédpanel egy példánya. A cikkben sut szereplő mintakód a tesztelt rendszert jelöli.

A DialogTestClient konstruktor további paramétereket biztosít, amelyek lehetővé teszik az ügyfél viselkedésének további testreszabását, vagy paraméterek átadását a tesztelt párbeszédpanelre, ha szükséges. A párbeszédpanel inicializálási adatait átadhatja, egyéni köztes szoftvereket adhat hozzá, vagy használhatja a saját TestAdapter és ConversationState -példányát.

Üzenetek küldése és fogadása

A SendActivityAsync<IActivity> metódus lehetővé teszi, hogy szöveges kimondott szöveget vagy egy IActivity üzenetet küldjön a párbeszédpanelre, és visszaadja az első kapott üzenetet. A <T> paraméter a válasz erős gépelt példányának visszaadására szolgál, így anélkül érvényesítheti, hogy el kellene adnia.

var reply = await testClient.SendActivityAsync<IMessageActivity>("hi");
Assert.Equal("Where would you like to travel to?", reply.Text);

Bizonyos esetekben a robot több üzenetet is küldhet egyetlen tevékenységre válaszul, ezekben az esetekben DialogTestClient a válaszok várólistára kerülnek, és a GetNextReply<IActivity> metódussal a következő üzenetet a válaszsorból jelenítheti meg.

reply = testClient.GetNextReply<IMessageActivity>();
Assert.Equal("All set, I have booked your flight to Seattle for tomorrow", reply.Text);

GetNextReply<IActivity> null értéket ad vissza, ha nincsenek további üzenetek a válaszsorban.

Tevékenységek érvényesítése

A CoreBot-mintában szereplő kód csak a Text visszaadott tevékenységek tulajdonságát érvényesíti. Összetettebb robotok esetén érdemes lehet más tulajdonságokat is érvényesíteni, például Speak, InputHint, ChannelDatastb.

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

Ezt úgy teheti meg, hogy egyenként ellenőrzi az egyes tulajdonságokat a fent látható módon, saját segédeszközöket írhat a tevékenységek érvényesítéséhez, vagy használhat más keretrendszereket, például a FluentAssertionst egyéni állítások írásához és a tesztkód egyszerűsítéséhez.

Paraméterek átadása a párbeszédpanelekre

A DialogTestClient konstruktor rendelkezik egy initialDialogOptions olyan szerkezettel, amellyel paramétereket adhat át a párbeszédpanelnek. Ebben a MainDialog mintában például inicializál egy BookingDetails objektumot a nyelvfelismerési eredményekből, a felhasználó kimondott szövegéből feloldott entitásokkal, és átadja ezt az objektumot a meghíváshoz BookingDialog.

Ezt egy tesztben az alábbiak szerint valósíthatja meg:

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 fogadja ezt a paramétert, és ugyanúgy éri el a tesztben, mint a parancsból MainDialogvaló meghíváskor.

private async Task<DialogTurnResult> DestinationStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    var bookingDetails = (BookingDetails)stepContext.Options;
    ...
}

Az érvényesítési párbeszédpanel az eredmények megjelenítését

Egyes párbeszédpanelek egy értéket szeretnek BookingDialog vagy DateResolverDialog visszaadnak a hívó párbeszédpanelnek. Az DialogTestClient objektum egy DialogTurnResult tulajdonságot tesz elérhetővé, amely a párbeszédpanel által visszaadott eredmények elemzésére és érvényesítésére használható.

Például:

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

A DialogTurnResult tulajdonság a vízesés lépései által visszaadott köztes eredmények vizsgálatára és érvényesítésére is használható.

Tesztkimenet elemzése

Néha szükség van egy egységteszt átiratának olvasására a teszt végrehajtásának elemzéséhez anélkül, hogy hibakeresést kellene végeznie a teszten.

A Microsoft.Bot.Builder.Testing csomag egy XUnitDialogTestLogger olyan csomagot tartalmaz, amely naplózza a párbeszédpanel által a konzolra küldött és fogadott üzeneteket.

A köztes szoftver használatához a tesztnek közzé kell tennie egy konstruktort, amely megkapja ITestOutputHelper az XUnit tesztfuttató által biztosított objektumot, és létre kell hoznia egy XUnitDialogTestLogger olyan objektumot, amely a paraméteren keresztül middlewares lesz átadvaDialogTestClient.

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

        ...
    }
}

Íme egy példa a XUnitDialogTestLogger kimeneti ablak naplóinak konfigurálásakor:

Example middleware output from XUnit.

A tesztkimenetnek az XUnit használatakor a konzolra való küldésével kapcsolatos további információkért lásd : Kimenet rögzítése az XUnit dokumentációjában.

A rendszer ezt a kimenetet a buildkiszolgálón is naplózza a folyamatos integrációs buildek során, és segít a buildelési hibák elemzésében.

Adatvezérelt tesztek

A legtöbb esetben a párbeszédpanel logikája nem változik, és a beszélgetés különböző végrehajtási útvonalai a felhasználói kimondott szövegeken alapulnak. Ahelyett, hogy egyetlen egységtesztet írnál az egyes változatokhoz a beszélgetésben, egyszerűbb az adatvezérelt tesztek (más néven paraméteres teszt) használata.

A dokumentum áttekintési szakaszában található mintateszt például bemutatja, hogyan tesztelhet egy végrehajtási folyamatot, másokat azonban nem, például:

  • Mi történik, ha a felhasználó nemet mond a megerősítésre?
  • Mi a teendő, ha más dátumot használnak?

Az adatvezérelt tesztek lehetővé teszik ezeknek a permutációknak a tesztelését anélkül, hogy újra kellene írni a teszteket.

A CoreBot-mintában az XUnit tesztjeit használjuk Theory a tesztek paraméterezéséhez.

Elméleti tesztek az InlineData használatával

Az alábbi teszt ellenőrzi, hogy a rendszer megszakít-e egy párbeszédpanelt, amikor a felhasználó a "mégse" szöveget mondja.

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

A párbeszédpanel megszakításához a felhasználók beírhatják a "kilépés", a "nem bánom" és a "stop it" szöveget. Ahelyett, hogy minden lehetséges szóhoz új tesztesetet írnál, írjon egyetlen Theory tesztmetódust, amely az értékek listájával InlineData fogadja el a paramétereket az egyes tesztesetek paramétereinek meghatározásához:

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

Az új teszt négyszer lesz végrehajtva a különböző paraméterekkel, és minden eset gyermekelemként jelenik meg a ShouldBeAbleToCancel Visual Studio Test Explorer tesztje alatt. Ha bármelyikük meghiúsul az alább látható módon, a teljes tesztkészlet újrafuttatása helyett a jobb gombbal rákattinthat és hibakeresést végezhet a sikertelen forgatókönyvben.

Example test results for in-line data.

Elméleti tesztek MemberData és összetett típusok használatával

InlineData olyan kis adatvezérelt tesztekhez hasznos, amelyek egyszerű értéktípus-paramétereket (sztring, int stb.) kapnak.

A BookingDialog rendszer kap egy BookingDetails objektumot, és egy új BookingDetails objektumot ad vissza. A párbeszédpanel tesztjének nem paraméteres verziója a következőképpen nézne ki:

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

A teszt paraméterezéséhez létrehoztunk egy osztályt BookingDialogTestCase , amely tartalmazza a teszteset adatait. Tartalmazza a kezdeti BookingDetails objektumot, a várt BookingDetails és egy sztringtömböt, amely tartalmazza a felhasználótól küldött kimondott szövegeket, valamint az egyes fordulókhoz tartozó párbeszédpanel várt válaszait.

public class BookingDialogTestCase
{
    public BookingDetails InitialBookingDetails { get; set; }

    public string[,] UtterancesAndReplies { get; set; }

    public BookingDetails ExpectedBookingDetails { get; set; }
}

Létrehoztunk egy segédosztályt BookingDialogTestsDataGenerator is, amely egy metódust IEnumerable<object[]> BookingFlows() tesz elérhetővé, amely visszaadja a teszt által használandó tesztesetek gyűjteményét.

Ahhoz, hogy az egyes teszteseteket külön elemként jelenítse meg a Visual Studio Test Explorerben, az XUnit tesztfuttatónak olyan összetett típusokra van szüksége, mint BookingDialogTestCase a implementálás IXunitSerializable– ennek leegyszerűsítéséhez a Bot.Builder.Testing keretrendszer egy olyan osztályt TestDataObject biztosít, amely implementálja ezt a felületet, és a teszteset adatainak implementálása IXunitSerializablenélkül is becsomagolható.

Íme egy töredék IEnumerable<object[]> BookingFlows() , amely bemutatja, hogyan használja a két osztályt:

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

Miután létrehozunk egy objektumot a tesztadatok tárolására, és egy olyan osztályt hozunk létre, amely tesztesetek gyűjteményét teszi elérhetővé, az XUnit MemberData attribútumot használjuk ahelyett InlineData , hogy az adatokat a tesztbe táplálnánk, az első paraméter a MemberData statikus függvény neve, amely visszaadja a tesztelési esetek gyűjteményét, a második paraméter pedig a metódust elérhetővé tevő osztály típusa.

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

Íme egy példa a DialogFlowUseCases Visual Studio Test Explorer tesztjeinek eredményeire a teszt végrehajtásakor:

Example results for the booking dialog.

A Mocks használata

A jelenleg nem tesztelt dolgokhoz használhat makettelemeket. Referenciaként ez a szint általában egység- és integrációs tesztelésnek tekinthető.

A lehető legtöbb elem szimulálása lehetővé teszi a tesztelt darab jobb elkülönítését. A modellelemekre jelölt elemek közé tartozik a tárolás, az adapter, a köztes szoftver, a tevékenységfolyamat, a csatornák és minden más, amely nem közvetlenül része a robotnak. Ez azt is jelentheti, hogy ideiglenesen eltávolít bizonyos szempontokat, például a köztes szoftvereket, amelyek nem vesznek részt a tesztelt robotban, hogy elkülönítse az egyes elemeket. Ha azonban teszteli a köztes szoftverét, érdemes lehet inkább a robotot kiképeztetni.

A mocking elemek több formát is igénybe vehetnek, az elemek egy másik ismert objektumra való lecserélésétől a hello világ minimális funkcionalitásának megvalósításáig. Ez azt is jelentheti, hogy eltávolítja az elemet, ha nincs rá szükség, vagy arra kényszeríti, hogy ne tegyen semmit.

A makettek lehetővé teszik a párbeszédpanelek függőségeinek konfigurálását, és biztosítjuk, hogy a teszt végrehajtása során ismert állapotban legyenek anélkül, hogy külső erőforrásokra, például adatbázisokra, nyelvi modellekre vagy más objektumokra kellene támaszkodnia.

Ahhoz, hogy a párbeszédpanel könnyebben tesztelhető és csökkenthető legyen a külső objektumoktól való függősége, előfordulhat, hogy be kell szúrnia a külső függőségeket a párbeszédpanel-konstruktorba.

Például ahelyett, hogy a következőben MainDialogkell példányt létrehozniaBookingDialog:

public MainDialog()
    : base(nameof(MainDialog))
{
    ...
    AddDialog(new BookingDialog());
    ...
}

Konstruktorparaméterként adunk át egy példányt BookingDialog :

public MainDialog(BookingDialog bookingDialog)
    : base(nameof(MainDialog))
{
    ...
    AddDialog(bookingDialog);
    ...
}

Ez lehetővé teszi, hogy lecseréljük a BookingDialog példányt egy szimulált objektumra, és egységteszteket írjunk anélkül MainDialog , hogy meghívnánk a tényleges BookingDialog osztályt.

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

Mocking Dialogs

A fentiekben MainDialog leírtaknak megfelelően meghívja BookingDialog az objektum beszerzését BookingDetails . A következő modellpéldányokat BookingDialog implementáljuk és konfiguráljuk:

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

Ebben a példában a Moq használatával hoztuk létre a makett párbeszédpanelt, valamint a Setup viselkedés konfigurálásához használt metódusokat.Returns

LUIS-eredmények szimulálása

Megjegyzés:

A Language Understanding (LUIS) 2025. október 1-jén megszűnik. 2023. április 1-től nem hozhat létre új LUIS-erőforrásokat. Az Azure AI Language részeként már elérhető a nyelvértés újabb verziója.

Az Azure AI Language egyik funkciója, a beszélgetési nyelv megértése (CLU) a LUIS frissített verziója. További információ a Bot Framework SDK nyelvfelismerési támogatásáról: Természetes nyelvfelismerés.

Egyszerű forgatókönyvekben a következő kódon keresztül valósíthatja meg a LUIS-eredmények szimulálásával:

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

A LUIS-eredmények összetettek lehetnek. Ha így van, egyszerűbb rögzíteni a kívánt eredményt egy JSON-fájlban, erőforrásként hozzáadni a projekthez, és deszerializálni egy LUIS-eredményben. Here's an example:

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

További információk