【发布时间】:2014-08-13 22:10:30
【问题描述】:
这是这个问题的后续问题:Mocking $modal in AngularJS unit tests
引用的 SO 是一个很好的问题,答案非常有用。然而,在此之后我留下的问题是:如何对模态实例控制器进行单元测试?在引用的 SO 中,调用控制器被测试,但模态实例控制器被模拟。可以说后者也应该进行测试,但事实证明这非常棘手。原因如下:
我将从此处引用的 SO 中复制相同的示例:
.controller('ModalInstanceCtrl', function($scope, $modalInstance, items){
$scope.items = items;
$scope.selected = {
item: $scope.items[0]
};
$scope.ok = function () {
$modalInstance.close($scope.selected.item);
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
});
所以我的第一个想法是直接在测试中实例化控制器,就像任何其他被测控制器一样:
beforeEach(inject(function($rootScope) {
scope = $rootScope.$new();
ctrl = $controller('ModalInstanceCtrl', {$scope: scope});
});
这不起作用,因为在这种情况下,Angular 没有提供程序来注入 $modalInstance,因为它是由 UI modal 提供的。
接下来,我转向计划 B:使用 $modal.open 实例化控制器。这将按预期运行:
beforeEach(inject(function($rootScope, $modal) {
scope = $rootScope.$new();
modalInstance = $modal.open({
template: '<html></html>',
controller: 'ModalInstanceCtrl',
scope: scope
});
});
(注意,模板不能是空字符串,否则它会神秘地失败。)
现在的问题是我无法查看范围,这是对资源收集等进行单元测试的惯用方式。在我的真实代码中,控制器调用资源服务来填充选项列表;我尝试对此进行测试设置了一个 expectGet 来满足我的控制器正在使用的服务,并且我想验证控制器是否将结果放在其范围内。但是模态正在为模态实例控制器创建一个 new 范围(使用我作为原型传入的范围),我不知道如何才能获得该范围的一个洞。 modalInstance 对象没有进入控制器的窗口。
对“正确”的测试方法有什么建议吗?
(注意:为模态实例控制器创建派生作用域的行为并不意外——这是记录在案的行为。无论如何,我关于如何测试它的问题仍然有效。)
【问题讨论】:
标签: javascript angularjs unit-testing angular-ui