我们如何为嵌套函数编写单元测试用例(Jasmine)?
Posted
技术标签:
【中文标题】我们如何为嵌套函数编写单元测试用例(Jasmine)?【英文标题】:How do we write Unit test cases (Jasmine) for nested functions? 【发布时间】:2017-05-29 02:51:47 【问题描述】:我正在为以下场景编写一个测试用例。代码覆盖率没有完全覆盖。不知道能不能写。如果我问任何错误的方法,请指导我为这种情况编写一个测试用例,并在将来避免这个问题。至少告诉它可能与否
(function()
'use strict';
angular
.module('myApp')
.component("testLockCtrl",
templateUrl: 'wwwroot/html/myLocation/testLock.html',
controller: 'testLockCtrl as vm'
)
.controller("testLockCtrl", testLockCtrl);
testLockCtrl.$inject = ['SessionService', 'HttpRequestSoapAPI'];
/*Parent Controller*/
function testLockCtrl($rootScope, $mdDialog)
vm.ChangeDataController=ChangeDataController;
/*childer controller*/
function ChangeDataController($scope)
$scope.tempData = true;
/*following functions (child of change data controller) can called in click*/
$scope.editData = function()
$scope.tempData = false;
$scope.editDatas = function()
/*some code*/
function addData()
TC$DialogMgr.tag(function(tagID)
$mdDialog.show(
locals: testCase: vm ,
controller: ChangeDataController,
parent: angular.element(document.body),
templateUrl: "wwwroot/html/myLocation/addData.html",
clickOutsideToClose: true,
preserveScope: true,
controllerAs: 'vm'
).then(function()
, function()
).finally(function()
TC$DialogMgr.unTag(tagID);
);
, TC$DialogMgr.type.Input);
)();
it("Should check if Module Flag status is received", function ()
var data = [ loc: 'mde', Status: -1 ];
testLockCtrl.ChangeDataController(data);
var testData=testLockCtrl.editDatas ()
expect(testData).toBeDefined();
)
上面是我的测试用例,它可以覆盖子控制器,而不是它的嵌套函数。我们可以从controller.js文件访问测试用例中的范围变量吗?而且代码覆盖率仅涵盖 ChangeDataController 函数,而不是其内部函数。请帮我写一个测试用例并清除我的疑问。
【问题讨论】:
正如答案所暗示的,每个应该被监视或模拟的函数都应该作为范围(或控制器)方法公开。 嗨,我已经更新了我的代码。你能试试看我做错了什么吗? 您没有公开 addData 作为方法,并且 editDatas 出于某种原因在 ChangeDataController 中设置。完全没有理由在组件中使用 $scope,这是反模式。 【参考方案1】:答案是您应该公开这些内部函数或间接测试它们。无论在哪里调用 addData
方法,您都可以确保您已经测试过该函数并将不同的参数传递给调用函数。
或者,如果您将addData
添加到$scope
,您可以更轻松地进行测试:
$scope.addData = function() /* ... */ ;
在你的测试中:
var result = controller.addData(...);
expect(result).toBe(expected);
【讨论】:
我试过同样的方法,但我不能。我更新了我的代码,你能看到吗?以上是关于我们如何为嵌套函数编写单元测试用例(Jasmine)?的主要内容,如果未能解决你的问题,请参考以下文章
如何为combineLatest rxjs Angular编写Jasmine Unit测试用例
如何使用 Jasmine 为以下 javascript 函数编写单元测试用例
AngularJS – 如何在 Jasmine 中为输入事件指令编写单元测试