【问题标题】:How do I cover the javascript code pattern || {}我如何覆盖 javascript 代码模式 || {}
【发布时间】:2014-01-12 22:28:26
【问题描述】:

我正在使用 JSCover 运行我的 Jasmine SpecRunner,它检查以下代码片段:

var MyRootObject = MyRootObject || {};

我的目标是将覆盖率提高到 100%,但我不确定如何最好地覆盖这种初始化 MyRootObject 的方法。

此模式用于每个库 javascript 文件的开头,以确保文件加载的顺序不重要(并且其中的函数和变量是 $.extend'ed)。

问题基本上是该脚本第一次也是唯一一次加载到 SpecRunner 中,它只运行该测试的一侧,而另一条路径未测试。

【问题讨论】:

  • 我对这个问题感到困惑。您是否正在尝试测试一段代码的性能,但想测试变量赋值的or 情况?如果是这样,为什么不设置var MyRootObject = false; 然后var MyRootObject = MyRootObject || {}
  • 虽然 100% 的覆盖率听起来不错,但覆盖像您的示例这样的东西是浪费时间和开发工作。我也认为根本不可能为此创建单元测试,除非您可以在单独的环境中执行此文件。如果可以的话,只需在运行脚本之前断言 MyRootObject 是未定义的,并在之后包含一个可能带有某些键的对象。
  • 在我们的例子中,我们在一个 javascript 文件中声明了公共 API,然后在另一个文件中,我们有扩展主 MyRootObject 以提供本地函数来支持公共 API 的支持函数(以及做繁重的工作)。由于这些多个文件,它们声明了var MyRootObject = MyRootObject || {},因此在野外,脚本顺序无关紧要。不想动态更改 SpecRunner.html 或拥有多个版本的 SpecRunner.html,我想涵盖这一行。我在下面发布了我的问题的解决方案,这意味着对主要代码进行了轻微的重写。

标签: javascript unit-testing jasmine code-coverage


【解决方案1】:

在四处挖掘之后,我找到了一个适合我的解决方案,当然,您的里程可能会有所不同:

var MyRootObject = MyRootObject || {};
$.extend(true, MyRootObject, {...});

我已替换为:

var MyRootObject = $.extend(true, MyRootObject, {...});

在 JQuery 内部,如果目标 (MyRootObject) 为 null 或未定义,它会自动将函数内部的目标分配为 {}。通过使用外部库(我已经在使用),我不再有我不遵循的条件路径,因为这是委托给 JQuery 库的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多