如何使用jasmine测试$ window.open

Sye*_*eed 9 jasmine angularjs karma-runner

这是我的功能

 $scope.buildForm = function (majorObjectId, name) {
      $window.open("/FormBuilder/Index#/" + $scope.currentAppId + "/form/" + majorObjectId + "/" + name);
  };
Run Code Online (Sandbox Code Playgroud)

这是我的茉莉花测试规范

            it('should open new window for buildForm and with expected id', function () {
            scope.majorObjectId = mockObjectId;
            scope.currentAppId = mockApplicationId;
            var name = "DepartmentMajor";
            scope.buildForm(mockObjectId, name);
            scope.$digest();
            expect(window.open).toHaveBeenCalled();
            spyOn(window, 'open');
            spyOn(window, 'open').and.returnValue("/FormBuilder/Index#/" + scope.currentAppId + "/form/" + scope.majorObjectId + "/" + name);
        });
Run Code Online (Sandbox Code Playgroud)

但当我尝试运行它时,它打开一个新选项卡,我不希望这发生,我只是想检查给定的returnValues是否存在不!

Bha*_*han 18

首先,你的期望(window.open).toHaveBeenCalled()是错误的.在监视事件之前你不能指望.现在提出你的问题,茉莉花有不同的方法来监视依赖关系,比如

  • .and.callThrough - 通过使用and.callThrough链接间谍,间谍仍将跟踪对它的所有调用,但此外它将委托给实际的实现.
  • .and.callFake - 通过使用and.callFake链接间谍,对间谍的所有调用都将委托给提供的函数.
  • .and.returnValue - 通过使用and.returnValue链接间谍,对该函数的所有调用都将返回一个特定值.

请查看Jamine doc以获取完整列表

根据您的要求提供下面的示例测试用例

$scope.buildForm = function() {
        $window.open( "http://www.google.com" );
    };
Run Code Online (Sandbox Code Playgroud)

将会

it( 'should test window open event', inject( function( $window ) {
        spyOn( $window, 'open' ).and.callFake( function() {
            return true;
        } );
        scope.buildForm();
        expect( $window.open ).toHaveBeenCalled();
        expect( $window.open ).toHaveBeenCalledWith( "http://www.google.com" );
    } ) );
Run Code Online (Sandbox Code Playgroud)