如何涵盖javascript代码模式| |{}

如何涵盖javascript代码模式| |{},javascript,unit-testing,jasmine,code-coverage,Javascript,Unit Testing,Jasmine,Code Coverage,我正在使用JSCover运行我的Jasmine SpecRunner,它检查以下类型的代码片段: var MyRootObject = MyRootObject || {}; 我的目标是将覆盖率提高到100%,但我不确定如何最好地覆盖这种初始化MyRootObject的方法 此模式用于每个库javascript文件的开头,以确保加载文件的顺序不重要(并且其中的函数和变量是$.extend'ed) 基本上,问题是第一次也是唯一一次将此脚本加载到SpecRunner中时,它只运行此测试的一侧,而另

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

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

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


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

仔细研究后,我找到了一个适合我的解决方案,当然,您的里程数可能会有所不同:

var MyRootObject = MyRootObject || {};
$.extend(true, MyRootObject, {...});
我已替换为:

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

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

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