每月檔案: 1 月 2014

可憐的人在 JavaScript 中的緩存

[TL;博士版本: 使用 cookie 來存儲非同步調用的結果; 立即呈現過去非同步調用的結果,然後在頁面載入後驗證它們。]

我一直在 SharePoint 的內聯網網站為用戶端的功能, 除其他事項外, 程式化的二級導航功能表選項都通過週期性老自訂清單管理。  想法是在用戶端獲取,不影響或受影響,由它推出的全球導航控制"他們的"網站的功能表.

(有件事令人難以置信顛覆有關添加指向一個 HTML 檔案,載入一些 CSS 和 JS,從根本上改變幾乎一切有關網站的行為......,但那是另一篇文章為 CEWP)

這個漂亮的簡單的代碼:

痛點在這裡是每次有人點擊該網站的頁面之一, 該使用者的 web 瀏覽器中伸出來獲取清單中的項。  一旦開發完成並測試已被證明是穩定和完整的東西, 此調用是不必要的多 99% 因為功能表中很少發生變化的時間。  它也有一個很奇怪的 UI 影響這是共同的在這個勇敢新世界超 ajaxy web 網站的 — — 頁上呈現,並只然後不會呈現在功能表。  它是緊張不安,我認為讓人分心。  和抖動. 所以, 緩存。 

我修改邏輯難耐:

  • 查找包含功能表中,如我上次讀取它的瀏覽器中的 cookie
    • 如果發現, 立即呈現它。  不要等待頁面完成載入。  (你需要確保你的 HTML 擺放在這裡, 但它並不難做).
  • 等待頁面完成載入,並進行非同步調用以載入了功能表項目從清單中使用休息或 lists.asmx 或不管
  • 比較我對 cookie
    • 如果它與匹配, 停止
    • 否則, 使用 jQuery 的, 如果動態填充一群 <李>中 <ul>
  • 使用 CSS 來做的所有格式
  • 利潤!

你們中的一些會說, "嘿! 沒有真正緩存會在這裡因為你反正讀功能表中 每一次.”  你說得對 — — 我不會給伺服器任何種類的斷裂。  但因為該調用是非同步和頁面的初始後會發生完全呈現 HTML 有效載荷, "感覺"更能回應使用者。  功能表中呈現漂亮一樣頁上繪製。  如果功能表中發生了變化, 使用者因此而遭受抖動重新繪製功能表, 但僅此一次.

有一些方法可以使此緩存功能更加有效和伺服器在同一時間幫忙:

  • 在"cookie 緩存"是有效的最低限度的規則中 24 小時或一些其他時限. 只要沒有過期的 cookie, 使用 cookie 的功能表快照和從來沒打伺服器.

哦那是所有現在我想說 :). 

如果任何人有任何聰明的想法在這裡我想要知道他們.

最後 — — 這種技術可以用於其他的東西。  此客戶機的頁的各種頁面都有一些資料驅動的事情, 其中許多不斷變化的相對較少 (像每週或每月一次).  如果您針對特定地區的功能, 您可以從本地 cookie 存儲拉內容並立即呈現給回應更快的使用者介面。  感覺速度更快,使用者即使不保存在伺服器任何週期。  你 可以 通過一些條件和觸發器決定廢除此 cookie 本機快取保存伺服器週期。  這就是所有情景和富有藝術氣息的東西和真正最大的樂趣 :). 

</結束>

undefined訂閱我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin

如何: 配置單元測試和測試覆蓋率與 QUnit.js 和 Blanket.js 辦公室 365 SharePoint 應用程式

簡介

我都一直在探索單元測試和測試覆蓋率的 JavaScript 作為我為 SharePoint 線上在辦公室工作一個新的 SharePoint 應用程式 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 位。  我在一個叫"QuizUtil.js",所以,創造了一個叫"QuizUtil_test.html",如圖所示的 HTML 頁面的指令檔中測試一堆函數:

image 圖 2

下面是代碼:

<!DOCTYPE html>
<html xmlns="HTTP://www.w3.org/ 1999/xhtml">
<>
    <標題>QuizUtil 試驗與 Qunit</標題>
    <連結 區域快線="樣式表" href="../CSS/qunit-1.13.0.css" />
    <腳本 類型="文本/javascript" src="QuizUtil.js" 資料覆蓋></腳本>
    <腳本類型 ="文本 javascript" src ="qunit 1.13.0.js"></腳本>
    <腳本類型 ="文本 javascript" src ="blanket.min.js"></腳本>

    <腳本>
        模組("getIDFromLookup");
        測試("QuizUtil getIDFromLookupField", 功能 () {
            var goodValue = "1;#保羅 · 高爾文";

            平等(getIDFromLookupField(goodValue) + 1, 2), "ID 的 [" + goodValue + "] + 1 應該是 2";
            平等(getIDFromLookupField(未定義), 未定義, "未定義輸入的參數應返回未定義的結果。");
            平等(getIDFromLookupField(""), 未定義, "空輸入的參數應返回未定義的值。");
            平等(getIDFromLookupField("gobbledigood3-thq;dkvn ada;skfja sdjfbvubvqrubqer0873407t534piutheqw;vn"), 未定義,"應始終返回結果可轉換為整數");
            平等(getIDFromLookupField("2;#一些其他人"), "2", "檢查 [2;#一些其他人].");
            平等(getIDFromLookupField("9834524;#長整型值"), "9834524", "大值測試。");
            notEqual(getIDFromLookupField("5;#任何人", 6), 6, "測試 notEqual (5 不等於 6 對於此示例: [5;#任何人]");

        });

        模組("htmlEscape");
        測試("QuizUtil htmlEscape()", 功能 () {
            平等(htmlEscape("<"), "&這是;", "逃離小於運算子 ('<')");
            平等(htmlEscape("<div 類 = "someclass">一些文本</div>"), "&這是;div 類 =&quot;此處將有機可乘&quot;&gt;一些文本&這是;/div&gt;", "更複雜的測試字串。");
        });

        模組("getDateAsCaml");
        測試("QuizUtil getDateAsCaml()", 功能 () {
            平等(getDateAsCaml(新增功能 日期("2013/12/31")), "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("不存在"), 未定義, "嘗試獲取參數值,當我們知道該參數不存在。");

        });

        模組("Cookie");
        測試("QuizUtil 各種 cookie 功能。", 功能 () {
            平等(setCookie("測試", "1", -1), getCookieValue("測試"), "讓我設置一個 cookie 應該工作。");
            平等(setCookie("anycookie", "1", -1), 真正的, "設置有效的烹飪應返回 '真正的'。");
            平等(setCookie("瘋狂的 cookie 名稱 !@#$%"%\^&*(()?/><.,", "1", -1), 真正的, "設置壞 cookie 的名稱應返回 false。");
            平等(setCookie(未定義, "1", -1), 未定義, "傳遞作為該 cookie 的名稱未定義。");
            平等(getCookieValue("不存在"), "", "Cookie 不存在測試。");
        });

    </腳本>
</>
<正文>
    <div id="qunit"></div>
    <div id="qunit 夾具"></div>

</正文>
</html>

有幾個這裡發生的事:

  1. 引用我的代碼 (QuizUtil.js)
  2. 引用 Qunity.js
  3. 定義某些模組 (getIDFromLookup, 餅乾, 和其他人)
  4. 放置 <div> 其 ID 是"qunit".

然後, 我只是把這頁和你這樣的東西:

image

圖 3

如果你看的頂部, 你有幾個選項, 其中兩個是有趣:

  • 隱藏通過的測試: 很明顯。  可以説明您的眼睛只看到問題的範圍和不多的雜波.
  • 模組: (下拉清單): 這將篩選到測試你想要的只是那些組測試.

至於測試本身 — — 幾個評論:

  • 不用說您需要編寫代碼,它是可測試的放在第一位。  使用該工具可以説明執行的紀律. 例如, 我有一個稱為"getTodayAsCaml 函數()”.  這並不是非常可測試因為它需要沒有輸入的參數,並測試是否相等, 我們將需要不斷更新的測試代碼,以反映當前的日期。  我重構它通過添加資料輸入的參數,然後傳遞時我想今天的日期加楓格式的當前日期.
  • 它看起來非常堅固和 Qunit 框架檔自行測試。  它可以做簡單的事情,像相等性測試,並還提供了對支援 ajax 樣式調用 ("真正"或嘲笑使用您最喜愛的褻).
  • 經歷過程也會迫使你想通過邊緣情況 — — 發生了什麼"未定義"或 null 傳遞到一個函數。  它使死了簡單的測試了這些方案。  好的東西.

覆蓋面 Blanket.js

Blanket.js 是 Qunit 補充通過跟蹤代碼的執行過程中運行測試的實際行數。  它集成右 Qunit 即使它是整個單獨的應用程式, 它很好地扮演 — — 它看起來真的像它是一個無縫的應用程式.

這是 blanket.js 在行動:

image 圖 4

image

圖 5

(你實際上必須按一下頂部的"啟用覆蓋範圍"核取方塊 [見圖 3] 要啟用此功能。)

在圖中突出顯示的行 5 我的測試中的任何沒有執行過, 所以我需要設計一種測試不會導致他們能夠執行如果我想要全覆蓋.

獲取 blanket.js 工作按照下面的步驟:

  1. 它從下載 http://blanketjs.org/.
  2. 將它添加到您的專案
  3. 更新您的測試線束頁 (在我的案子中 QuizUtil_test.html) 如下所示:
    1. 引用的代碼
    2. 裝飾你 <腳本> 像這樣的引用:
    <腳本 類型="文本/javascript" src="QuizUtil.js" 資料覆蓋></腳本>

Blanket.js 拾取"的資料覆蓋"屬性並不會它的魔力。  它的掛接 Qunit, 更新的使用者介面,若要添加"啟用覆蓋範圍"選項和瞧!

摘要 (TL; 博士)

使用 Qunit 來編寫測試案例.

  • 下載
  • 將它添加到您的專案
  • 寫測試線束頁
  • 創建您的測試
    • 重構您的代碼可測試的一些
    • 有創意!  瘋狂的想, 不可能的情況下,無論如何進行測試.

使用 blanket.js,以確保覆蓋範圍

  • 確保工作 Qunit
  • 下載 blanket.js 並將其添加到您的專案
  • 將它添加到您的測試線束頁:
    • 將引用添加到 blanket.js
    • "資料-蓋"將屬性添加到您 <腳本> 標記
  • 運行 Qunit 測試.

我從來沒有做之前,有一些基本的東西,在少數幾個小時的工作。 

幸福測試!

</結束>

undefined訂閱我的博客.

跟我在 Twitter 上 http://www.twitter.com/pagalvin