如何在jasmine测试中触发window.onbeforeunload

时间:2014-11-15 03:31:17

标签: angularjs jasmine

目前,我已经创建了一个附加到表单的指令。任何时候表单都是脏的,我有一个window.onbeforeunload尝试离开时弹出的确认模式。现在我正在尝试编写一个jasmine测试,以确保在刷新/ url更改时调用window.onbeforeunload。

var app = angular.directive('app');

app.directive('dialog',[$window, function() {
    return {
        restrict: 'A',
        require: 'form',
        link: function(scope, element, attrs, formCtrl) {
            $window.onbeforeunload = function () {
                if(formCtrl.$dirty) {
                    return 'Are you sure you want to leave this form';
                }
            };
        }
    };
}]);

茉莉花规格的一部分

beforeEach(inject(function(_$rootScope_,_$state_,_$window_) {
    $rootScope = _$rootScope_;
    $state = _$state_;
    $window = _$window_;

    spyOn($window, 'onbeforeunload')
}));

describe('Listen for window prompt', function () {
    it('should be called on url/refresh change', function () {
        window.location.reload();
        expect($window.onbeforeunload).toHaveBeenCalled();
    });
});

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试测试该方法是否执行了它应该执行的操作,当URL更改/刷新时会触发该操作。您可能应该测试此事件中发生的代码。您可以在窗口对象上使用jquery trigger命令在jasmine脚本中触发此事件,如下所示。

$(窗口).trigger(' onbeforeunload&#39);

答案 1 :(得分:1)

在单元测试中,仅测试“onbeforeunload”事件的实现就足够了。否则,您可以使用Protractor编写e2e测试。

您可以像这样进行测试:

describe('page leave handler', function () {
  it('should handle page leave', function () {
    // given
    var element = compileDirective();
    var formCtrl = element.controller('ngForm');
    formCtrl.$dirty = true;

    // when
    var result = $window.onbeforeunload();

    // then
    expect(result).toBe('Are you sure..');
  });
});