اختبار التكامل باستخدام Bot Framework و DirectLine (2)

· 3 دقيقة قراءة

في هذا الجزء، سنقوم بترخيص DirectLine والحصول على القيم من استجابة الروبوت.

الآن بعد أن قمنا بإلغاء التسلسل، حان الوقت للحصول على المعلومات من المجموعة والأجزاء الكاملة التي سنستخدمها للحصول على الترخيص، وإجراء مكالمات API وتأكيد النتيجة.

لن يغطي الشرح التالي جميع المعلومات الأساسية حول كيفية عمل Bot Framework، إذا لم تكن تفهم ذلك، فيرجى الانتقال والتحقق من الوثائق الرسمية.

إجراء مكالمات API باستخدام WebClient

لتسهيل الاتصال بواجهة برمجة التطبيقات، قمت بإنشاء فئة utils، حيث نحفظ الوظائف التي سنستخدمها عدة مرات، تتضمن هذه الفئة uploadString لـ POST و downloadString لـ 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);
        }
    }

ترخيص الخط المباشر

إذا قرأت الوثائق الرسمية، يمكنك العثور على كيفية القيام بذلك، وهو أمر سهل للغاية، باستخدام وظائفنا يصبح الأمر أسهل. أولًا، تذكر أننا داخل عبارة foreach، نظرًا لأننا نقوم بالمصادقة لكل حالة، في حالة نفاد الوقت، مما يعني فشل الاختبار.

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

الآن لدينا الرمز المميز، والذي سيتم استخدامه لإجراء جميع الاستدعاءات التالية إلى نقطة نهاية المحادثة.

إنشاء محادثة.

من أجل التحدث إلى الروبوت، نحتاج أولاً إلى إنشاء محادثة، وستعيد هذه المحادثة رمزًا مميزًا جديدًا يتضمن معرف المحادثة.

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

نقوم أيضًا بتخزين newToken وconversationId، وكلاهما ضروري للمستخدم لإرسال رسائل إلى الروبوت.

إرسال النشاط إلى المحادثة

الآن، باستخدام conversationId وconversationEndpoint، يمكننا إنشاء نقطة النهاية النهائية لإرسال Activity وهو request من ملف json.

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

احصل على أحدث رسالة

في سجل الرسائل، بعد أن أرسلنا النشاط، من المفترض أن يكون الروبوت قد استجاب بالفعل، لذلك يتعين علينا الحصول على جميع الرسائل التي تحتوي على العلامة المائية ثم استخدام تلك العلامة المائية، لتصفية أحدث رسالة/نشاط.

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

وهذا كل ما في هذا الجزء، الجزء التالي سيتضمن الجزء الذي نحصل فيه على النص من assert في json، وتحويله إلى كود مثل استخدام eval() في Javascript ولكن في C#، ثم استخدام Assert.isTrue() للحصول على نتيجة الاختبار النهائية.

تذكر أنه تم تخزين كافة التعليمات البرمجية في جيثب الخاص بي في مستودع هذا.