下面是我试图进行单元测试的控制器的部分代码。我讨厌发布一些我还没有尝试过的东西,但我很遗憾我应该如何开始测试这段代码。我认为部分问题是我不确定modalInstance
是如何执行的。如果你能看到一个很好的切入点,请告诉我。
$scope.confirmDelete = function (account) {
var modalInstance = $modal.open({
templateUrl: '/app/accounts/views/_delete.html',
controller: function (global, $scope, $modalInstance, account) {
$scope.account = account;
$scope.delete = function (account) {
global.setFormSubmitInProgress(true);
accountService.deleteAccount(global.activeOrganizationId, account.entityId).then(function () {
global.setFormSubmitInProgress(false);
$modalInstance.close();
},
function (errorData) {
global.setFormSubmitInProgress(false);
});
};
$scope.cancel = function () {
global.setFormSubmitInProgress(false);
$modalInstance.dismiss('cancel');
};
},
resolve: {
account: function () {
return account;
}
}
});
答案 0 :(得分:1)
首先,要使其可以正常测试,您可能希望将嵌套控制器提取到与此相同的角度模块中的第一类控制器。
然后,您可以测试此当前控制器(称之为CtrlA)直到confirmDelete
,然后测试新提取的,即模态控制器' (让我们单独调用CtrlB)。
换句话说,在您的CtrlA测试中,您应该调用confirmDelete
并期望$ modal.open toHaveBeenCalled
。请注意,在这些测试中,您将模拟$modal.open
:
spyOn(模态,'打开');
引擎盖下,angular-ui-bootstrap实例化一个模态并正确设置所有引用,这样在CtrlB中注入的$modalInstance
与在$modal.open
返回的CtrlA中的modalInstance相同。由于这是第三方代码,因此您无需测试'通过单元测试证明此声明的有效性。单元测试只是假设已收到的$modalInstance
CtrlB与在CtrlA中创建的相同。
现在剩下的就是测试CtrlB中的每个范围方法的行为方式。为此,您将创建一个间谍对象并将其作为$modalInstance
注入CtrlB,然后您就像编写任何普通控制器的测试一样编写测试。
例如,调用cancel
并测试是否已调用间谍$modalInstance.dismiss
(等等)
祝你好运!