javascript - 如何在我的子 Controller 中模拟此方法来测试它?

标签 javascript angularjs jasmine karma-jasmine

我有一个有方法的 Angular Controller

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

我似乎找不到方法来测试 handleChange() 方法或使用 jasmine 的 Controller 对象,因为这两个测试都会引发此错误: 类型错误:$scope.$parent.doSomething 不是函数

我已经这样做了:

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

我做错了什么以及如何解决这个问题?

最佳答案

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

var myScope = $rootScope.$new();

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

然后将其传递给您的 Controller :

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

在你的断言 block 上你做这样的事情:

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

希望有帮助。

关于javascript - 如何在我的子 Controller 中模拟此方法来测试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805314/

相关文章:

javascript - 在特定 View 的情况下隐藏部分按钮

javascript - 我怎样才能使 AngularJS 指令停止传播?

javascript - Jasmine Node 说 "0 tests"当有*有*测试

javascript - Protractor - 如何在 Protractor 中设置默认输入语言

javascript - 用 Jasmine 测试 JS,有没有办法匹配传入对象的类型?

javascript - 如何在运行时在 innerHTML 中设置 id?

javascript - 如何从 javascript 中找到模态对话框开启器?

javascript - 文档 createElement 最短语法

angularjs - 如何在没有模板的情况下在 angularjs 中进行内联编辑?

angularjs - 已完成 ng-include 在 Angular js 中的加载