ライブコードの例を見ることなく、正確なガイダンスを提供するのは少し難しいです(これは、ジャスミンテスト用のテンプレートを持つplunkを提供するのが良い理由です)。init
メソッドは、環境に応じて異なる設定ロジックが必要です。もしそうなら、この初期化ロジックを専用のサービスにカプセル化し、テスト中にこのサービスをモックすることが前進する方法です(これはまさに@Joe Dyndaleが提案しているものです)。
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はプランカードのライブコード
です
init()で実際に起こっていることについてもう少しコンテキストを使って、適切な答えを得ることができます。それに応じて、あなたが取ることができるいくつかの異なるパスがあります。 – johlrich
サービスや指示に移動する候補者のように聞こえます。コードをコントローラから移動することができれば、単体テストで(あなたのケースではおそらくnoop関数を使って)嘲笑することができます。 –