测试打开 md-dialog 的组件

Testing component that opens md-dialog

我正在尝试为打开对话框的 Angular 组件编写单元测试,但我无法这样做,因为我无法触发对话框的关闭。

如何使 md 对话框从测试用例中解析?

我创建了一个存储库,其中包含一个可以重现问题的基本示例,并复制了下面的核心部分。有一个 index.html 用于手动验证代码是否正常工作,一个显示问题的测试用例以及一个如何在 md 代码中编写测试的示例。

存储库 - https://github.com/gseabrook/md-dialog-test-issue

组件非常基础

angular
.module('test', ['ngMaterial'])
.component('dialogTest', {
    template: '<button ng-click="showDialog()">Show Dialog</button>',
    controller: function($scope, $mdDialog) {
        var self = this;

        $scope.showDialog = function() {
            self.dialogOpen = true;

            var confirm = $mdDialog.confirm()
                .title('Dialog title')
                .ok('OK')
                .cancel('Cancel');

            $mdDialog.show(confirm).then(function(result) {
                self.dialogOpen = false;
            }, function() {
                self.dialogOpen = false;
            });
        }
    }
});

而且测试也很简单

it("should open then close the dialog", function() {
    var controller = element.controller("dialogTest");

    expect(controller.dialogOpen).toEqual(undefined);

    expect(element.find('button').length).toEqual(1);
    element.find('button').triggerHandler('click');

    expect(controller.dialogOpen).toBeTruthy();

    rootScope.$apply();
    material.flushInterimElement();

    element.find('button').eq(2).triggerHandler('click');

    rootScope.$apply();
    material.flushInterimElement();

    expect(controller.dialogOpen).toBeFalsy();
});

我设法通过设置根元素解决了这个问题,因为问题似乎与在测试中编译的元素与 angular-material 附加的根元素无关对话框也是。

我已经用完整代码更新了 github 存储库,但重要的部分是

beforeEach(module(function($provide) {
    rootElem = angular.element("<div></div>")
    $provide.value('$rootElement', rootElem);
}));

beforeEach(inject(function(_$rootScope_, _$compile_, $mdDialog, _$material_) {
    ...
    element = getCompiledElement();
    angular.element(window.document.body).append(rootElem);
    angular.element(rootElem).append(element);
}));