如何使用 Mocha / Jasmine 在控制器方法中为 if else 案例获得 Karma 覆盖?

Posted

技术标签:

【中文标题】如何使用 Mocha / Jasmine 在控制器方法中为 if else 案例获得 Karma 覆盖?【英文标题】:How to get Karma coverage for the if else cases in controller method using Mocha / Jasmine? 【发布时间】:2017-04-22 04:59:55 【问题描述】:

我有以下控制器方法:

function changeItem(itemList) 
            vm.selectedItem = '';
            if(itemList !== null || itemList !== '' && itemList !== undefined)
				if (itemList.guestFirstName !== '' &&
					itemList.guestFirstName !== undefined &&
					itemList.guestFirstName !== null) 
					vm.selectedItem += itemList.guestFirstName + ' ';
				
				if (itemList.guestLastName !== '' &&
					itemList.guestLastName !== undefined &&
					itemList.guestLastName !== null) 
					vm.selectedItem += itemList.guestLastName + ' ';
				
				Iif (itemList.type !== '' &&
					itemList.type !== undefined &&
					itemList.type !== null) 
					vm.selectedItem += itemList.type + '-';
				
				if (itemList.id !== '' &&
					itemList.id !== undefined &&
					itemList.id !== null) 
					vm.selectedItem += itemList.id + ' ';
					if (itemList.id === "All") 
						vm.selectedId.push(vm.itemLists.id);
					
					else 
						vm.selectedId = itemList.id;
					
				
			
        
    

spec.js:

t('listController - changeItem()', inject(function () 
            var itemList = [  
                  
                    "id":111,
                    "guestfirstName":"Test",
                    "guestlastName":"Test",
                    "type":"BUSINESS"
                 ,
                  
                    "id":222,
                    "guestfirstName":"Test",
                    "guestlastName":"Test",
                    "type":"BUSINESS"
                ,
            ];
            var selectedItem = "Test Test BUSINESS-111"

            controller.changeItem(itemList);
            scope.$apply();
            expect(controller.selectedItem).to.equal(selectedItem);
            expect(controller.selectedId).to.equal(itemList[0].id);
        ));

但是,当我运行测试时,它说语句和分支除了函数之外没有被覆盖。

谢谢

【问题讨论】:

【参考方案1】:

您可以使用单独的 it() 语句来检查 itemList 的各个部分,每次都巧妙地更改它,然后重新运行 changeItem() 方法。然后,您将定制该 itemList 以达到每个 if 语句以达到您需要的覆盖范围。请记住,您必须确保测试提供了一些东西。

我可能会将 itemList 声明移到 beforeEach() 中,然后在每个 it() 测试中稍作修改:

itemList[0].guestLastName = '';

另一方面,我建议使用 Ramda 或 Lodash 等 3rd 方库来处理您的未定义/空值检查。 if (!_.isNil(guestLastName)) 例如将涵盖您的所有 3 个测试。

【讨论】:

能否详细说明或举个例子?对不起,我是新来的蜜蜂

以上是关于如何使用 Mocha / Jasmine 在控制器方法中为 if else 案例获得 Karma 覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

Jasmine (mocha) 嵌套“it”测试

针对 Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [关闭]

javascript 用于邮差测试脚本的mocha / jasmine兼容测试框架(缩小不到1KB)

html 转换器markdown多级列表到jasmine / mocha测试结构http://jsbin.com/qahurad

在 Nodejs 中使用 Jasmine 测试 promise 是不是被解决或拒绝

接口测试自动化测试,我推荐使用Mocha