gpt4 book ai didi

initialization - AngularJS,防止在 Jasmine 测试期间启动 Controller 上的init方法

转载 作者:行者123 更新时间:2023-12-04 06:19:29 25 4
gpt4 key购买 nike

我有一个带有在实例化时启动的init()方法的 Controller 。
它完成了很多事情,这些事情对我的应用程序在实时环境中很有用,但是却与我的单元测试 spy 混为一谈。

在单元测试环境中实例化 Controller 时,有没有办法防止其调用?
还是一种在webapp上下文中自动调用它而无需在 Controller 代码末尾显式调用init()的方法?

最佳答案

在没有看到实时代码示例的情况下很难提供精确的指导(这就是为什么通常提供一个带有Jasmine测试模板的插件的好主意)的原因,但听起来您的init方法执行了一些设置逻辑,根据环境而有所不同。如果是这样,那么前进的方法将是将该初始化逻辑封装到一个专用服务中,并在测试过程中模拟该服务(这正是@Joe Dyndale的建议)。

前提是您的 Controller 如下所示:

app.controller('MainCtrl', function($scope) {
$scope.init = function() {
//something I really don't want to call during test
console.log("I'm executing");
};
});

它可以重构为:
app.factory('InitService', function() {
return {
init = function() {
//something I really don't want to call during test
console.log("I'm executing");
}
};
});

app.controller('MainCtrl', function($scope, InitService) {
InitService.init();
});

然后进行模拟的测试如下所示:
describe('Testing an initializing controller', function() {
var $scope, ctrl;

//you need to indicate your module in a test
beforeEach(module('plunker'));
beforeEach(module(function($provide){
$provide.factory('InitService', function() {
return {
init: angular.noop
};
});
}));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {
$scope: $scope
});
}));

it('should test sth on a controller', function() {
//
});
});

最后 here是plunker中的实时代码

关于initialization - AngularJS,防止在 Jasmine 测试期间启动 Controller 上的init方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921602/

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