如何使用Jasmine测试$window.open

12

这是我的函数

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

这是我的Jasmine测试规格

            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);
        });

但是当我尝试运行它时,它会打开一个新标签页,而我不希望发生这种情况,我只想检查给定的returnValues是否存在!


1
我相信在你的测试中应该是 $window,注入 $window - Chandermani
1
我注入了 $window,但是在运行后它仍然会打开一个新的标签页。 - Syed Rasheed
1个回答

27

首先,你的期望 (window.open).toHaveBeenCalled() 放置的位置是错误的。 在监听事件之前不能有期望。 现在回答你的问题, Jasmine 中有不同的方法来监听依赖关系,例如:

  • .and.callThrough - 通过将 spy 与 and.callThrough 链接,spy 将仍然跟踪所有调用,但除此之外它还将委托给实际实现。
  • .and.callFake - 通过将 spy 与 and.callFake 链接,所有对 spy 的调用都将委托给提供的函数。
  • .and.returnValue - 通过将 spy 与 and.returnValue 链接,对该函数的所有调用都将返回特定值。

请查看 Jasmine 文档 以获取完整列表。

以下是符合您要求的示例测试用例:

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

即将发生

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" );
    } ) );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接