每月档案: 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), true, "设置有效的烹饪应返回 '真正的'。");
            平等(setCookie("疯狂的 cookie 名称 !@#$%"%\^&*(()?/><.,", "1", -1), true, "设置坏 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