Denetleyicimi oluşturmak için "denetleyici olarak" sözdizimini kullanıyorum. Varsayılan verileri yüklemek için bir işlevi çağıran özel bir başlatma işlevim var. Benim testteJasmine'i kullanarak bir denetleyici yöntemini nasıl uygularım?
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
var mc = this;
mc.dataLoaded = false;
function init() {
mc.loadData();
}
mc.loadData = function(){
mc.dataLoaded = true;
}
init();
});
Ben loadData
işlev çağrılmış olup olmadığını kontrol etmek için bir casus yaratıyorum. Fonksiyonun, mc.dataLoaded
bayrağı için test edilerek çağrıldığını doğrulayabilsem de, casusum çağrılan işlevi kaydetmiyor gibi görünüyor. İşlev çağrısını doğru bir şekilde kaydetmek için casusu nasıl alabilirim?
describe('Testing a Hello World controller', function() {
var $scope = null;
var ctrl = null;
//you need to indicate your module in a test
beforeEach(module('plunker'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl as mc', {
$scope: $scope
});
spyOn($scope.mc, 'loadData').and.callThrough();
}));
it('should call load data', function() {
expect($scope.mc.loadData).toHaveBeenCalled();
//expect($scope.mc.dataLoaded).toEqual(false);
});
});
Soru belki de kapsam dışıdır ... $ kapsamı içinde olmayan bir işlevi gizlemek mümkün olabilir mi? Demek istediğim, bu kodda casusluk yapmam. –
"Eğer MainCtrl sadece dahili bir şey yapıyorsa, bunun sonucunu, örneğin, denetleyicinin veri/özelliklerinin güncellendiğini iddia ederek test edin. Yeterince önemsiz olup olmadığını test etmeye bile değmeyebilir." BU GERÇEKTİR! –
Ve iç denetleyici başlatma kodu başka bir hizmete güvenmiyor, sınama gerektirecek kadar karmaşık ve kapsam özelliklerinde hiçbir yan etkisi yok mu? Başlatma kodunu başka bir hizmete taşımak için tek seçeneğiniz var mı? Sadece ünite testlerini mümkün kılmak için kodunuzu daha karmaşık hale getirecek bir utanç gibi görünüyor. – d512