我需要在jasmine测试中100%地覆盖这个服务,但是它没有让我覆盖控制器。
下面是对话框的服务:
(function () {
'use strict';
angular.module('core.dialog').service('dialog', ToasterService);
ToasterService.$inject = ['$translate', '$mdDialog'];
function ToasterService($translate, $mdDialog) {
this.show = function (key, values) {
$translate(key, values).then(function (message, $event) {
$mdDialog.show({
controller: DialogController,
templateUrl: 'app/common/core/dialog/dialog.html',
targetEvent: $event,
locals: {
message : message
}
});
function DialogController($scope, $mdDialog, message) {
$scope.message = message;
$scope.closeDialog = function() {
$mdDialog.hide();
};
}
});
};
}
})();但是,当我运行代码覆盖率报告时,它并没有涵盖DialogController函数。
有人能帮我一下吗?提前谢谢。
发布于 2017-02-11 07:39:15
这是一个古老的问题,但如果有人想知道如何解决这个问题,这里有一种方法,几种方法之一。我将使用angular创建控制器,将其移出服务,以便您只能对控制器进行单元测试。然后spyOn $mdDialog.hide,并确保它已被调用。假设DialogController(...)被移出服务,因此它是可见的。
angular.module('example')
.controller('DialogController' DialogController);然后,在稍后设置用于监视的测试商店$mdDialog时,如果您正在使用从hide()返回的promise执行任何操作,则还需要$q或您想要使用的任何promise。
var mdDialog, q;
beforeEach(inject(function ($injector) {
mdDialog = $injector.get("$mdDialog");
q = $injector.get("$q");然后创建控制器和elsewhere深入介绍的$rootScope.$digest()。最后,在你的测试中:
spyOn(mdDialog, 'hide').and.callFake(function(){
var deferred = q.defer();
deferred.resolve();
return deferred.promise;
});
// TODO: call your closeDialog() controller function here (may need to call $apply)
expect(mdDialog.hide).toHaveBeenCalled();https://stackoverflow.com/questions/33095263
复制相似问题