gpt4 book ai didi

javascript - 使用 sinon stub 在 Angular Controller 构造中调用的范围方法

转载 作者:行者123 更新时间:2023-11-29 15:32:55 25 4
gpt4 key购买 nike

我有一个 Controller ,它在构造时调用附加到 $scope 的方法:

angular.module('example', []).controller('exampleCtrl', function($scope) {
$scope.method = function () { ... };

$scope.method();
});

我想测试一下,在构建 Controller 的过程中,这个方法被调用了。我使用 jasmine 作为我的测试框架,使用 sinon.js 作为我的模拟框架。

describe('tests', function() {
var $scope, $controller;

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

describe('During construction', function() {
it('should call "method"', function() {
$controller('exampleCtrl', { $scope: $scope });

var methodStub = sinon.stub($scope, 'method');

expect(methodStub.called).toBe(true);
});
});
});

这失败了,因为一旦 $controller() 被调用,它会立即调用 $scope.method(),然后我才能将其 stub 。但是,如果我尝试在构建之前对方法进行 stub ,

it('should call "method"', function() {
var methodStub = sinon.stub($scope, 'method');

$controller('exampleCtrl', { $scope: $scope });

expect(methodStub.called).toBe(true);
});

sinon 抛出错误:TypeError: Cannot read property 'restore' of undefined,因为 $scope.method 未定义,因为我还没有调用构造函数!

我也曾尝试直接在 $scope 上 stub 该方法,即 $scope.method = sinon.stub(),但是在 Controller 构造。

那么,是否可以对构造期间调用的方法进行 stub ?

最佳答案

它不会工作,因为 Controller 总是覆盖你的 stub 。

这更像是一个干净代码的问题。

首先, Controller 不应该包含任何复杂的逻辑。通常它会进行测试,以便您模拟依赖项并检查它们是否被正确调用。

其次,首选 Controller 符号是“controller as”。因此,Controller 是一个经典的 JS 类。如果您在原型(prototype)中定义方法,您可以模拟/ stub 它。

但总的来说,这个要求有点不寻常,可能表明 Controller 使它太多了。

关于javascript - 使用 sinon stub 在 Angular Controller 构造中调用的范围方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32634870/

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