Integrationstest mit Bot Framework und DirectLine (2)
In diesem Teil nehmen wir die DirectLine-Autorisierung vor und rufen die Werte aus der Antwort des Bots ab.
Nachdem wir nun die Deserialisierung durchgeführt haben, ist es an der Zeit, die Informationen aus der Sammlung und den Gesamtheiten abzurufen, die wir verwenden werden, um die Autorisierung zu erhalten, die API-Aufrufe durchzuführen und das Ergebnis zu bestätigen.
Die folgende Erklärung deckt nicht alle grundlegenden Informationen zur Funktionsweise des Bot Frameworks ab. Wenn Sie es nicht verstehen, schauen Sie sich bitte die offizielle Dokumentation an.
API-Aufrufe mit WebClient durchführen
Um uns das Aufrufen der API zu erleichtern, habe ich eine Klasse utils erstellt, in der wir die Funktionen speichern, die wir einige Male verwenden werden. Diese Klasse enthält uploadString für POST und downloadString für GET.
public class Utils
{
/// <summary>
/// Uploads to an URL and gets result
/// </summary>
/// <typeparam name="T">Type of object you are receiving</typeparam>
/// <param name="bearer">Token</param>
/// <param name="url">Url</param>
/// <param name="serializedJson">Serialized JSON to send</param>
/// <returns></returns>
public static T uploadString<T>(string bearer, string url, string serializedJson)
{
string serializedResult = "";
/// Webclient
using (var client = new WebClient())
{
/// Add headers
client.Headers.Add("Content-Type", "application/json");
client.Headers.Add("Authorization", $"Bearer {bearer}");
/// Upload string
serializedResult = client.UploadString(url, serializedJson);
}
/// Get result and return it as an object
return JsonConvert.DeserializeObject<T>(serializedResult);
}
/// <summary>
/// Downloads from URL
/// </summary>
/// <typeparam name="T">Type of object you are receiving</typeparam>
/// <param name="bearer">Token</param>
/// <param name="url">Url</param>
/// <returns></returns>
public static T downloadString<T>(string bearer, string url)
{
string serializedResult = "";
/// Webclient
using (var client = new WebClient())
{
/// Add headers
client.Headers.Add("Content-Type", "application/json");
client.Headers.Add("Authorization", $"Bearer {bearer}");
/// Download string
serializedResult = client.DownloadString(url);
}
/// Get result and return it as an object
return JsonConvert.DeserializeObject<T>(serializedResult);
}
}
DirectLine-Autorisierung
Wenn Sie die offizielle Dokumentation lesen, erfahren Sie, wie es geht, und es ist ganz einfach, mit unseren Funktionen ist es sogar noch einfacher. Denken Sie zunächst daran, dass wir uns innerhalb der foreach-Anweisung befinden, da wir die Authentifizierung für jeden Fall durchführen, für den Fall, dass uns die Zeit ausgeht, was bedeutet, dass der Test fehlschlägt.
/// Arrange with current requested values
string token, newToken, conversationId;
/// Act
/// 1 - Get token using secret from DirectLine in BotFramework panel
token = Utils.uploadString<DirectLineAuth>(data.Secret, data.DirectLineGenerateTokenEndpoint, "").token;
Jetzt haben wir das Token, das für alle folgenden Aufrufe an den Konversationsendpunkt verwendet wird.
Ein Gespräch erstellen.
Um mit dem Bot zu kommunizieren, müssen wir zunächst eine Konversation erstellen. Diese Konversation gibt ein neues Token zurück, das die Konversations-ID enthält.
/// 2 -Create a new conversation
var createdConversation = Utils.uploadString<DirectLineAuth>(token, data.DirectLineConversationEndpoint, "");
// This returns a new token and a conversationId
newToken = createdConversation.token;
conversationId = createdConversation.conversationId;
Außerdem speichern wir newToken und conversationId. Beide werden benötigt, damit der Benutzer Nachrichten an den Bot senden kann.
Aktivität an Konversation senden
Jetzt können wir mit dem conversationId und dem conversationEndpoint den endgültigen Endpunkt erstellen, um einen Activity zu senden, der der request aus der JSON-Datei ist.
/// 3 - Send an activity to the conversation with new token and conversationId
string directlineConversationActivitiesEndpoint = data.DirectLineConversationEndpoint + conversationId + "/activities";
Utils.uploadString<DirectLineAuth>(newToken, directlineConversationActivitiesEndpoint, JsonConvert.SerializeObject(entry.Request));
Aktuelle Nachricht abrufen
Nachdem wir die Aktivität gesendet haben, sollte der Bot im Nachrichtenverlauf bereits geantwortet haben. Daher müssen wir alle Nachrichten mit dem Wasserzeichen abrufen und dann mithilfe dieses Wasserzeichens die neueste Nachricht/Aktivität filtern.
/// 4 - Get all activities, we get a List<activity> and a watermark
var getLastActivity = Utils.downloadString<ActivityResponse>(newToken, directlineConversationActivitiesEndpoint);
/// 5 - Get the latest activity which is the response we should be expecting
var latestResponse = getLastActivity.activities[Int32.Parse(getLastActivity.watermark)];
Und das ist alles für diesen Teil. Der nächste Teil wird den Teil enthalten, in dem wir den Text aus dem assert im JSON abrufen, ihn in Code konvertieren, wie mit eval() in Javascript, aber in C#, und dann den Assert.isTrue() verwenden, um das endgültige Testergebnis zu erhalten.
Denken Sie daran, dass der gesamte Code in meinem Github in diesem-Repository gespeichert ist.