我需要在茉莉花测试中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函数。
有人可以帮我这个吗?提前谢谢。
答案 0 :(得分:0)
这是一个老问题,但如果有人想知道如何解决这个问题,这是一种方法,其中一种方法。我将使用angular创建控制器,将其移出服务,因此您只能对控制器进行单元测试。然后spyOn $ mdDialog.hide并确保它被调用。假设DialogController(...)已停止运行,因此它是可见的。
angular.module('example')
.controller('DialogController' DialogController);
然后,在设置测试存储$ mdDialog以便稍后进行间谍活动时,如果您正在使用hide()返回的承诺执行任何操作,则还需要$ q或您想要使用的任何承诺。
var mdDialog, q;
beforeEach(inject(function ($injector) {
mdDialog = $injector.get("$mdDialog");
q = $injector.get("$q");
然后你创建你的控制器和$ rootScope。$ digest(),深入了解elsewhere。 最后在你的测试中:
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();