【问题标题】:Karma-Jasmine: Testing the closing of a modalKarma-Jasmine:测试模态的关闭
【发布时间】:2016-01-26 13:24:38
【问题描述】:

情况:

我正在我的 Angular / Ionic 应用程序中测试模态的正常工作。

到目前为止,我可以正确测试模态已被调用的事实,但我不知道如何测试模态的正确关闭。

已经多次尝试并阅读了类似的问题,但没有找到解决方案。

代码:

控制器:

代码在应用程序中运行良好,它刚刚被重构以方便单元测试。

$scope.open_login_modal = function() 
{
    var temp = $ionicModal.fromTemplateUrl('templates/login.html',{scope: $scope});

    temp.then(function(modal) { 
        $scope.modal_login = modal;
        $scope.modal_login.show();
    });
};

$scope.close_login_modal = function() 
{
    $scope.modal_login.hide();
};

测试:

第一个测试(开放模式)工作正常并通过。第二个测试我不知道怎么做。

describe('App tests', function() 
{
    beforeEach(module('my_app.controllers'));

    // mocking the .then method of $ionicModal.fromTemplateUrl (it works)
    function fakeTemplate() 
    {
        return { 
            then: function(modal){
                $scope.modal_login = modal;
            }
        }
    }

    beforeEach(inject(function(_$controller_, _$rootScope_)
    {
        $controller = _$controller_;
        $rootScope = _$rootScope_;
        $scope = _$rootScope_.$new();

        $ionicModal = 
        {
            fromTemplateUrl: jasmine.createSpy('$ionicModal.fromTemplateUrl').and.callFake(fakeTemplate)
        }; 

        var controller = $controller('MainCtrl', { $scope: $scope, $rootScope: $rootScope, $ionicModal: $ionicModal });
    }));


    describe('Modal tests', function() 
    {
        it('should open login modal', function() 
        {
            $scope.open_login_modal();

            expect($ionicModal.fromTemplateUrl).toHaveBeenCalled();
            expect($ionicModal.fromTemplateUrl.calls.count()).toBe(1);
        });

        it('should close login modal', function() 
        {
            $scope.close_login_modal();
            // How can i test here that the modal has been close?
        });
    });

});

错误:

这是错误信息:TypeError: Cannot read property 'hide' of undefined

问题:

如何测试模态的关闭? 如何确定函数hide() 已被正确调用?

和在测试中声明modal有关吗?

非常感谢!

编辑:

此答案正确回答了“如何测试模式的关闭”问题,提供了在打开模式之前包含的正确解决方案。 如果您想知道如何正确地窥探我在另一个问题中提出的模式:

Karma-Jasmine: How to properly spy on a Modal?

给定的答案还给出了一般情况下如何窥探前提的规则。

【问题讨论】:

    标签: javascript angularjs ionic-framework jasmine karma-jasmine


    【解决方案1】:

    您的密切测试要求已打开模式登录,由于没有发生这种情况,您会收到该错误:

    我会重写你测试类似的东西:

    describe('Modal tests', function() {
      beforeEach(function(){
        $scope.open_login_modal();
      });
      it('should open login modal', function() {
        expect($ionicModal.fromTemplateUrl).toHaveBeenCalled();
        expect($ionicModal.fromTemplateUrl.calls.count()).toBe(1);
      });
      it('should close login modal', function() {
        $scope.close_login_modal();
        spyOn($scope.modal_login, 'hide');
        expect($scope.modal_login.hide()).toHaveBeenCalled();
      });
    });
    

    所以这两个测试都需要调用 open_login_modal 函数,所以我添加了一个 beforeEach。您还需要对模式的隐藏功能进行间谍活动。

    【讨论】:

    • 谢谢!你知道我怎样才能正确地写那个间谍吗?
    • 我刚刚用一个 spyOn 电话编辑了我的答案,试试看,无论如何应该是这样的
    • 不幸的是我得到 $scope.modal_login.hide 不是一个函数。我想我在测试中声明模态时遗漏了一些东西。
    • 我认为这篇文章可能会给你一些线索stackoverflow.com/questions/21214868/… 虽然它是一个引导模式,但测试流程是相似的
    • 谢谢。我提出了一个单独的问题,仅集中于如何监视模式:stackoverflow.com/questions/33367354/… 现在所有的疑问都消失了:)
    猜你喜欢
    • 2014-11-19
    • 2018-05-10
    • 2015-12-07
    • 1970-01-01
    • 2018-01-31
    • 2014-05-04
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多