如何在我的子控制器中模拟此方法来测试它?

时间:2016-11-25 12:40:16

标签: javascript angularjs jasmine karma-jasmine

我有一个角度控制器,它有一个方法

$scope.handleChange = function (index) {
    //Logic
    $scope.$parent.doSomething();
};

我似乎无法找到用jasmine测试handleChange()方法或控制器对象的方法,因为两个测试都会抛出此错误: TypeError: $scope.$parent.doSomething is not a function

我做到了这一点:

beforeEach(inject(function ($controller, $injector, $q, $rootScope) {
var qReference = $q;
var rootScopeReference = $rootScope;
var $scope = rootScopeReference.$new();

var controllerReference = $controller('MyController', {
        $scope: $scope
    });
}));

it('Test Case-1: Mycontroller is defined', function () {
    expect(controllerReference).toBeDefined();
});

我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

您可以将范围存储在测试类的变量中,使用间谍模拟方法doSomething:

var myScope = $rootScope.$new();

spyOn(myScope.$parent, 'doSomething');

然后将其传递给您的控制器:

var controllerReference = $controller('MyController', {
    $scope: myScope 
});

在您的断言块中,您可以执行以下操作:

expect(myScope.$parent.doSomething).toHaveBeenCalled();

希望有所帮助。