【问题标题】:Controller methods call Jasmine unit test suite with Karma in AngularJs控制器方法在 AngularJs 中使用 Karma 调用 Jasmine 单元测试套件
【发布时间】:2016-04-20 09:44:03
【问题描述】:

我对 Karma 和 Jasmine 很陌生,我用它来为我的 AngularJs 应用程序编写单元测试。

默认情况下,在运行我调用以初始化控制器中的数据的测试套件函数时。在运行测试套件时有什么方法可以避免这个调用?

在下面找到代码sn-p:

BaseCtrl.js

App.controller('BaseCtrl', ['$scope', '$rootScope', 'Data', function($scope, $rootScope, Data){
    //initialize
    $rootScope.loader = false;
    $rootScope.data = false;

    $scope.init = function(){
        $rootScope.loader = true;
        Data.init(function(data){
            $rootScope.loader = false;
            $rootScope.data = data;
        });   
    };

    $scope.init();
}])

Data.js

App.service('Data', ['$http', function($http){
    return {
        init:function(callback){
            $http.get('/url').success(function(response){
               callback(response);
            });
        }
    };
}]);

BaseCtrl.spec.js

describe('BaseCtrl', function(){
    beforeEach(module('app'));

    var $controller, $rootScope, $scope;

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

    describe('Loader', function(){
        var controller, $scope = {};
        beforeEach(function(){
            controller = $controller('BaseCtrl', {$scope:$scope, $rootScope:$rootScope});
        });

        it('should be false by default', function(){

            // Check the default value
            expect($rootScope.loader).toBe(false);

            // Some code to determine the call, then

            expect($rootScope.loader).toBe(true);

            // Some code to determine the call is done, then

            expect($rootScope.loader).toBe(false);
        });
    });
});

【问题讨论】:

  • 当单元测试你应该期望你的调用被调用......这就是重点。也就是说,为了防止您的调用调用 $httpbackend,您应该改用模拟服务并将它们注册到 Angular 注入器中
  • 嗨@DavidL 感谢您的评论,我理解您的意思,但是有什么方法可以在我的测试套件中跟踪/观看呼叫,以便我可以测试其他范围受其影响的数据这个电话。我尝试过使用spy(Data, 'init'),但它只跟踪我是否从测试规范中调用该方法。
  • 当然。如果您监视注入到测试中的 mockedData 服务,您可以使用 spy(Data, 'init').and.callThrough() 强制间谍调用您的真实方法。

标签: javascript angularjs unit-testing karma-jasmine


【解决方案1】:

是的,使用$httpBackend 创建一个模拟并返回您想要的任何内容。

$httpBackend.when('GET', '/url').respond({});

【讨论】:

  • 嗨 [Dan] 感谢您的回答,从服务返回的数据不是问题。我几乎没有依赖这个调用的范围,因为我无法控制这些调用,所以我无法验证。我曾尝试使用spy(Data, 'init'),但它只跟踪该方法是否已从测试套件中调用。有什么办法可以让我看到初始化调用
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多