gpt4 book ai didi

angularjs - 通过 $controller 从基本 Controller 继承的单元测试 AngularJS Controller

转载 作者:行者123 更新时间:2023-12-03 08:16:56 27 4
gpt4 key购买 nike

场景是我有一个 ChildCtrl继承自 BaseCtrl 的 Controller 关注 this inheritance pattern :

angular.module('my-module', [])
.controller('BaseCtrl', function ($scope, frobnicate) {
console.log('BaseCtrl instantiated');

$scope.foo = frobnicate();

// do a bunch of stuff
})

.controller('ChildCtrl', function ($controller, $scope) {
$controller('BaseCtrl', {
$scope: $scope,
frobnicate: function () {
return 123;
}
});
});

假设 BaseCtrl做了一堆东西并且已经很好地测试了,我想测试一下 ChildCtrl实例化 BaseCtrl有一定的论据。我最初的想法是这样的:
describe("ChildCtrl", function () {
var BaseCtrl;

beforeEach(module('my-module'));

beforeEach(module(function($provide) {
BaseCtrl = jasmine.createSpy();
$provide.value('BaseCtrl', BaseCtrl);
}));

it("inherits from BaseCtrl", inject(function ($controller, $rootScope) {
$controller('ChildCtrl', { $scope: $rootScope.$new() });

expect(BaseCtrl).toHaveBeenCalled();
}));
});

但是,当我运行测试时,从未调用过 spy ,并且控制台显示“BaseCtrl 已实例化”,表示 $controller正在使用实际 Controller 而不是我提供的实例 $provide.value() .

测试这个的最佳方法是什么?

最佳答案

所以它看起来像 $controller不在 $provide.value() 中按名称搜索 Controller 命名空间。相反,您必须使用 $controllerProvider.register()方法,只能从 module.config() 访问堵塞。幸运的是,我们可以使用一个 Hook 来访问 $controllerProvider。在被测模块上。

更新后的测试代码如下:

describe("ChildCtrl", function () {
var BaseCtrl;

beforeEach(module('my-module', function ($controllerProvider) {
BaseCtrl = jasmine.createSpy();
BaseCtrl.$inject = ['$scope', 'frobnicate'];

$controllerProvider.register('BaseCtrl', BaseCtrl);
}));

beforeEach(inject(function ($controller, $rootScope) {
$controller('ChildCtrl', { $scope: $rootScope.$new() });
}));

it("inherits from BaseCtrl", inject(function ($controller, $rootScope) {
expect(BaseCtrl).toHaveBeenCalled();
}));

it("passes frobnicate() function to BaseCtrl that returns 123", function () {
var args = BaseCtrl.calls.argsFor(0);
var frobnicate = args[1];

expect(frobnicate()).toEqual(123);
});
});

关于angularjs - 通过 $controller 从基本 Controller 继承的单元测试 AngularJS Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27297196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com