ארכיון חודשי: ינואר 2014

האיש המסכן של אחסון במטמון בג'אווה סקריפט

[TL;ד ר גירסה: שימוש בקבצי cookie כדי לאחסן את תוצאות הקריאות אסינכרונית; לעיבוד תוצאות הקריאות האחרונות האסינכרונית מיד, לאחר מכן לאמת אותם לאחר טעינת העמוד.]

אני עובד באתר האינטרא-נט של SharePoint עבור לקוח כי תכונות, בין היתר, ניווט משני מסוגנן אפשרויות תפריט אשר מנוהלים באמצעות רשימה מותאמת אישית זקן רגיל.  הרעיון הוא שהלקוח מקבל לשלוט התפריט של האתר "שלהם" מבלי להשפיע או להיות מושפעים הניווט העולמי ע י זה.

(יש משהו מאוד חתרנית אודות הוספת CEWP שמצביע על קובץ HTML זה טוען כמה CSS, JS אורחותיו כמעט הכל על ההתנהגות של אתר. אבל זה בשביל עוד פוסט)

הקוד עבור זה פשוט יפה:

הנקודה כאוב זה, בכל פעם שמישהו פוגע באחד העמודים באתר, דפדפן האינטרנט של המשתמש הוא מושיט יד כדי לקבל פריטים מהרשימה  לאחר dev השלמת הבדיקות הוכח שהדברים יהיו יציבים ולהשלים, קריאה זו אינה נחוצה יותר 99% מהזמן מאז התפריט משתנה לעיתים רחוקות.  יש לו גם השפעה UI מוזר אשר נפוץ בהעולם של אתרי אינטרנט היפר-ajaxy – מלבדך, רק אז התפריט רינדור.  זה מרצד מסיח את הדעת לדעתי.  ולחוץ.. כל כך, אחסון במטמון. 

התאמתי את הלוגיקה נוהג כך:

  • לחפש קובץ cookie בדפדפן המכיל את התפריט כפי בפעם האחרונה קראתי את זה
    • אם נמצאו, לדקלם את זה מיד.  לא רוצה להמתין הטעינה.  (אתה צריך לוודא כי ה-HTML שלך נמצא במיקום אסטרטגי כאן, אבל זה לא קשה לעשות).
  • להמתין לסיים את הטעינה אסינכרונית להתקשר כדי לטעון את פריטי התפריט מתוך רשימה באמצעות מנוחה או lists.asmx או מה שלא יהיה
  • להשוות בין מה יש לי נגד העוגיה
    • אם זה מתאים, . תפסיק
    • אחרת, בעזרת jQuery, באופן דינמי לאכלס חבורה אם <li>ב <ul>
  • שימוש ב- CSS כדי לעשות את כל העיצוב
  • רווח!

חלק מכם עומדים לומר, "היי! אין ממש מטמון דרך כאן מאז שאתה קורא את התפריט בכל מקרה בכל פעם.”  אתה צודק-אני לא נותן השרת כל סוג של הפסקה.  אבל כי השיחה האסינכרונית ולא קורה אחרי הדף הוא ראשוני תוכן HTML מלא רינדור, "אני מרגיש" קשובים יותר למשתמש.  התפריט מעבד די כמה מצייר הדף.  אם התפריט יקרה השינוי, המשתמש הוא נתון מרצד חידשו של התפריט, אבל רק פעם אחת.

ישנן מספר דרכים להפוך את האחסון במטמון ליעילה יותר ולעזור השרת באותו הזמן:

  • להכניס כלל "המטמון העוגיות" בתוקף למשך תקופה מינימלית של 24 שעות או איזה פרק זמן אחר. כל עוד יש אין עוגיה שפג תוקפם, . מעולם לא הכיתי את השרת ולהשתמש בזק תפריט של העוגייה.

טוב, זה כל מה שעולות לי לראש כרגע :). 

אם למישהו יש רעיונות חכם פה אני אשמח להכיר אותם.

אחרון – טכניקה זו יכולה לשמש לדברים אחרים.  דף של הלקוח יש מספר דברים מונחי-נתונים על עמודים שונים, רבים מהם שינוי יחסית נדירות (כמו פעם בשבוע או פעם בחודש).  אם ייעדת בתחומים ספציפיים של פונקציונליות, אתה יכול לתת ממשק משתמש קשובים יותר על ידי משיכת תוכן מהחנות קוקי המקומי ובעיבוד מיד.  זה מרגיש מהר יותר למשתמש גם אם אתה לא מציל את השרת בכל מחזורי.  אתה יכול שמור את מחזורי שרת על ידי החלטה כמה תנאים וגורמים לפסול את המטמון העוגיות המקומי הזה.  . זה הכל המצבית אמנותי דברים ואני באמת הכי הכיף :). 

</קצה>

undefinedמנוי על הבלוג שלי.

עקוב אחרי הטוויטר ב http://www.twitter.com/pagalvin

איך: קביעת תצורה של יחידת מבחן, מבחן כיסוי עם QUnit.js ו- Blanket.js עבור משרד 365 יישום SharePoint

מבוא

אני בודק אפשרות בדיקות יחידה ולבדוק כיסוי של JavaScript כמוך יישום SharePoint חדש עבור SharePoint online במשרד 365 סוויטה.  בין שבילי מחקר ברור רוקני Qunit.js מיד אחרי זה, כדי Blanket.js.

QUnit תן לי להגדיר בדיקות יחידה לקבץ אותן מודולים.  מודול הוא רק דרך פשוטה לארגון בדיקות הקשורות. (אני לא בטוח, אני משתמש בו כמתוכנן, . אבל זה עובד בשבילי עד כה עם סט קטן של בדיקות שהגדרתי עד כה).

Blanket.js משתלב עם Qunit, זה יראה לי את השורות בפועל של JavaScript היו –, ויותר מכך-לא באמת בוצעו במהלך מריצים את. הבדיקה.  זהו "כיסוי"-קווי לבצע מכוסים על ידי הבדיקה בעוד שאחרות אינן.

בין הגדרת מקרי מבחן טוב להצגת כיסוי, אנחנו יכולים להפחית את הסיכון כי הקוד שלנו יש מוסתרים פגמים.  . זמנים טובים.

Qunit

בהנחה שיש לך את Visual Studio פרוייקט הגדרת, התחל על-ידי הורדת את חבילת JavaScript של http://qunitjs.com.  הוסף את JavaScript ו- CSS המתאים הפתרון שלך.  . שלי נראה ככה:

image

איור 1

כפי שניתן לראות, אני משתמש 1.13.0 בזמנו כתבתי בבלוג זה. לא לשכוח להוריד ולהוסיף לקובץ ה-CSS.

את זה מהדרך, השלב הבא הוא ליצור סוג של מבחן לרתום להפנות את הקטעים Qunit.  אני בודק כל מיני פונקציות בקובץ script ששמו "QuizUtil.js" אז יצרתי דף HTML הנקראת "QuizUtil_test.html" כפי שמוצג:

image איור 2

. הנה הקוד:

<!DOCTYPE html>
<html xmlns= 'http://www.w3.org/ 1999/xhtml">
<הראש>
    <כותרת>מבחן QuizUtil עם Qunit</כותרת>
    <קישור rel= "גליון סגנונות" href="../CSS/qunit-1.13.0.css" />
    <קובץ script סוג= טקסט/javascript"" src="QuizUtil.js" נתונים-cover></קובץ script>
    <סקריפט סוג ="טקסט/javascript" src ="qunit-1.13.0.js"></קובץ script>
    <סקריפט סוג ="טקסט/javascript" src ="blanket.min.js"></קובץ script>

    <קובץ script>
        מודול("getIDFromLookup");
        מבחן("QuizUtil getIDFromLookupField", פונקציה () {
            var goodValue = "1;#פול Galvin";

            שווה(getIDFromLookupField(goodValue) + 1, 2), "מזהה של [" + goodValue + "] + 1 צריכים להיות 2";
            שווה(getIDFromLookupField(לא מוגדרת), לא מוגדרת, "לא מוגדר ארגומנט הקלט אמורה להחזיר תוצאה לא מוגדר.");
            שווה(getIDFromLookupField(""), לא מוגדרת, "ריק ארגומנט הקלט אמורה להחזיר ערך לא מוגדר.");
            שווה(getIDFromLookupField("gobbledigood3-thq;עדה dkvn;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), לא מוגדרת,"צריך תמיד להחזיר מכונית התוצאה למספר שלם");
            שווה(getIDFromLookupField("2;#אדם אחר"), "2", "בדיקת [2;#אדם אחר].");
            שווה(getIDFromLookupField("9834524;#ערך ארוך"), "9834524", "המבחן ערך גדול.");
            notEqual(getIDFromLookupField("5;#מישהו", 6), 6, "בדיקה של notEqual (5 לא שווה ל- 6 עבור דוגמה זו: [5;#מישהו]");

        });

        מודול("htmlEscape");
        מבחן("QuizUtil htmlEscape()", פונקציה () {
            שווה(htmlEscape("<"), "&lt;", "בריחה במרחק פחות ממרכזיה ('<')");
            שווה(htmlEscape("<מחלקה div =  "someclass">חלק מהטקסט</div>"), "&lt;מחלקה div =&quot;someclass&quot;&gt;חלק מהטקסט&lt;/div&gt;", "מחרוזת הבדיקה מורכבת יותר.");
        });

        מודול("getDateAsCaml");
        מבחן("QuizUtil getDateAsCaml()", פונקציה () {
            שווה(getDateAsCaml(חדש תאריך("12/31/2013")), "2013-12-31T:00:00:00", "בדיקת תאריך קשה מקודדת: [12/31/2013]");
            שווה(getDateAsCaml(חדש תאריך("01/05/2014")), "2014-01-05T:00:00:00", "בדיקת תאריך קשה מקודדת: [01/05/2014]");
            שווה(getDateAsCaml(חדש תאריך("01/31/2014")), "2014-01-31T:00:00:00", "בדיקת תאריך קשה מקודדת: [01/31/2014]");
            שווה(getTodayAsCaml(), getDateAsCaml(חדש תאריך()), "getTodayAsCaml() צריך להיות שווה getDateAsCaml(תאריך חדש())");
            שווה(getDateAsCaml("שטויות ערך"), לא מוגדרת, "מה אתה עושה. לנסות לקבל את התאריך של ערך שטויות.");
            שווה(getDateAsCaml(לא מוגדרת), לא מוגדרת, "לנסות להשיג התאריך [לא מוגדרת] תאריך.");
        });

        מודול("getParameterByName");
        מבחן("QuizUtil getParameterByName (ממחרוזת השאילתה)", פונקציה () {
            שווה(getParameterByName(לא מוגדרת), לא מוגדרת, "לנסות לקבל פרמטר לא מוגדר צריך להחזיר לא מוגדר.");
            שווה(getParameterByName("לא קיים"), לא מוגדרת, "מה אתה עושה. לנסות לקבל ערך פרמטר כשאנחנו יודעים שהפרמטר אינו קיים.");

        });

        מודול("עוגיות");
        מבחן("QuizUtil קוקי פונקציות שונות.", פונקציה () {
            שווה(setCookie("מבחן", "1", -1), getCookieValue("מבחן"), "לקבל עוגייה. אני צריך לעבוד.");
            שווה(setCookie("anycookie", "1", -1), נכון, "הגדרת חוקי הבישול צריכה להחזיר 'true'.");
            שווה(setCookie("עוגיות מטורף שם !@#$%"%\^&*(()?/><.,", "1", -1), נכון, "קביעת שם רע קוקי להחזיר 'false'.");
            שווה(setCookie(לא מוגדרת, "1", -1), לא מוגדרת, "עובר לא מוגדר כשם קובץ cookie.");
            שווה(getCookieValue("לא קיים"), "", "קוקי לא קיים מבחן.");
        });

    </קובץ script>
</הראש>
<הגוף>
    <div מזהה= "qunit"></div>
    <div מזהה= "qunit-אביזר"></div>

</הגוף>
</html>

ישנם מספר דברים קורים כאן:

  1. המפנה את הקוד שלי (QuizUtil.js)
  2. הפניה Qunity.js
  3. הגדרת מספר מודולים (getIDFromLookup, עוגיות, ואחרים)
  4. הצבת <div> שהמזהה שלה הוא "qunit".

לאחר מכן, אני פשוט תמשוך למעלה בדף זה ותקבל משהו כזה:

image

איור 3

אם תסתכל לרוחב החלק העליון, יש לך כמה אפשרויות, שניים מהם הם מעניינים:

  • הסתר עברו מבחנים: . זה דיי ברור  יכול לעזור העין שלך לראות את האזורים הבעייתיים, לא הרבה בלאגן.
  • מודול: (ברשימה הנפתחת): זה לסנן את הבדיקות עד קבוצות רק אלה של הבדיקות שהרצויות.

לגבי המבחנים עצמם – כמה הערות:

  • למותר לציין כי אתה צריך לכתוב את הקוד שלך כזה כי זה ברת מלכתחילה.  באמצעות הכלי יכול לעזור לאכוף משמעת הזה. למשל, היה לי פונקציה שנקראת "getTodayAsCaml()”.  זה לא מאוד ברת מאז לוקח אין ארגומנט הקלט כדי לבחון אותה לשוויון, היינו צריכים כל הזמן לעדכן את הקוד המבחן כך שישקף את התאריך הנוכחי.  אני refactored את זה על ידי הוספת פרמטר קלט נתונים ואז עובר את התאריך הנוכחי כשיבוא הנוכחי היום בתבנית CAML.
  • המסגרת Qunit מסמכי בדיקות משלה ונראה די חזקים.  הוא יכול לעשות דברים פשוטים כמו בדיקות לשוויון, יש גם תמיכה עבור שיחות בסגנון ajax (שניהם "אמיתי" או mocked באמצעות להתחשבנות האהוב שלך).
  • גם עובר התהליך מכריח אותך לחשוב דרך מקרים קצה – מה קורה עם "undefined" או null מועבר בתוך פונקציה.  זה מקל מאוד לבדוק תרחישים אלה..  . חומר טוב.

כיסוי עם Blanket.js

Blanket.js משלים Qunit על-ידי מעקב אחר הקווים בפועל של קוד לבצע במהלך בדיקות שלך.  זה משתלב נכון Qunit אז למרות שזה יישום נפרדת לגמרי, זה משחק יפה – נראה ממש כאילו זה app חלקה אחת.

. זה blanket.js בפעולה:

image איור 4

image

איור 5

(למעשה יש ללחוץ על תיבת הסימון "אפשר כיסוי" בחלק העליון [ראה איור 3] כדי לאפשר את זה.)

השורות המודגשות באיור 5 לא הוצאו להורג על ידי אחת הבדיקות שלי, אז אני צריך לתכנן ניסוי לגרום להם. להוציא להורג, אם אני רוצה כיסוי מלא.

להשיג blanket.js עבודה על-ידי ביצוע השלבים הבאים:

  1. להוריד אותו מ http://blanketjs.org/.
  2. להוסיף את הפרוייקט שלך
  3. עדכון דף הרתמה שלך במבחן (QuizUtil_test.html במקרה שלי) כדלקמן:
    1. להפנות את הקוד
    2. לקשט שלך <קובץ script> הפניה כזו:
    <קובץ script סוג= טקסט/javascript"" src="QuizUtil.js" נתונים-cover></קובץ script>

Blanket.js מרים את התכונה "נתונים-cover" ועושה את הקסם שלו.  זה הוקס לתוך Qunit, מעדכן את ממשק המשתמש כדי להוסיף את האפשרות "אפשר כיסוי" וזהו!

סיכום (TL; ד ר)

השתמש Qunit כדי לכתוב מקרי מבחן שלך.

  • להוריד את זה
  • להוסיף את הפרוייקט שלך
  • לכתוב עמוד לרתום ניסיון
  • ליצור את המבחנים שלך
    • והרץ חלק בקוד כדי להיות ברת
    • להיות יצירתי!  חושב של מטורף, תרחישים בלתי אפשרי, לבדוק אותם בכל מקרה.

השתמש blanket.js כדי להבטיח כיסוי

  • ודא ש-qunit פועל
  • הורדה blanket.js ולהוסיף אותו לפרוייקט שלך
  • להוסיף אותו לדף הרתמה שלך במבחן:
    • להוסיף הפניה blanket.js
    • להוסיף תכונה "מכסה נתונים" כדי שלך <קובץ script> תג
  • את הבדיקות Qunit.

אף פעם לא עשה את כל זה בעבר והיו כמה דברים בסיסיים בעבודה קומץ של שעות. 

בדיקה מאושר!

</קצה>

undefinedמנוי על הבלוג שלי.

עקוב אחרי הטוויטר ב http://www.twitter.com/pagalvin