Jasmine - 测试$ mdDialog

时间:2015-10-13 06:06:21

标签: angularjs karma-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函数。

有人可以帮我这个吗?提前谢谢。

1 个答案:

答案 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();