ich den folgenden Code in meinem ControllerAngularJS Unit-Test-Controller mit dem Versprechen
(function() {
'use strict';
angular
.module('bolt')
.controller('PackdownController', PackdownController);
PackdownController.$inject = ['$location', '$timeout', 'packdownService', 'modelTransformer', 'Packdown'];
function PackdownController($location, $timeout, packdownService, modelTransformer, Packdown) {
var vm = this;
vm.totalItemCount = 0;
vm.completedItemCount = 0;
vm.toDoItems = [];
vm.completedItems = [];
activatePackdown();
function activatePackdown() {
packdownService.GetAllTasks().then(function(data) {
if(data !== undefined && data !== null) {
if(data.error.state) {
showError('Error retrieving tasks', 'Please try again. If the problem persists, contact your supervisor', 'Close', toggleErrorModal);
}
else {
vm.totalItemCount = tasks.openItems + tasks.closeItems;
vm.completedItemCount = tasks.closeItems;
angular.forEach(tasks.bayTasks, function(value, key) {
if(value.status.description !== 'COMPLETED_THIS_CYCLE') {
var task = {
deptNbr: value.department.number,
bayName: value.aisle + '-' + value.bay,
status: {
code: value.status.code,
description: value.status.description
}
};
this.push(task);
}
}, vm.toDoItems);
angular.forEach(tasks.bayTasks, function(value, key) {
if(value.status.description === 'COMPLETED_THIS_CYCLE') {
var task = {
deptNbr: value.department.number,
bayName: value.aisle + '-' + value.bay,
completedBy: value.completedSystemUserId,
completedOn: new Date(value.completedTimeStamp)
};
this.push(task);
}
}, vm.completedItems);
}
}
});
}
}
})();
activatePackdown definiert haben, ist eine private Funktion, so kann ich es nicht direkt testen, aber ich kann den Wert testen (s) von öffentlichen Eigenschaften, sobald der Controller erstellt wurde. Da diese Funktion jedoch eine Servicemethode aufruft (die eine Zusage zurückgibt), weiß ich nicht, wie ich in der .then-Anweisung testen soll. Ich habe folgendes für meinen Unit-Test:
describe('activatePackdown', function(){
it('should call GetAllTasks and then set completed/total counts', function(done) {
var spy = sinon.spy(this.packdownService, 'GetAllTasks');
var ctlr = $controller('PackdownController');
expect(spy).toHaveBeenCalled();
});
});
die .toHaveBeenCalled gehen ganz gut, aber alles, was ich habe versucht, den Zustand der Objekte im .then zu testen, um zu tun. Zum Beispiel der Wert von vm.totalItemCount. Ich weiß, dass ich die GetAllTasks-Methode nicht wirklich ausführen möchte, also habe ich den Spion mit sinon.spy erstellt, aber ich bin jetzt an einem Punkt, an dem ich nicht weiß, was ich als nächstes tun soll. Ich habe verschiedene Vorschläge aus verschiedenen Blogs ausprobiert, aber nichts schien zu funktionieren. Jede und alle Hilfe wird sehr geschätzt
Danke für den Versuch zu helfen, ho Da der Controller $ scope nicht verwendet, wird ein Fehler ausgegeben. Beachten Sie, dass ich ein IIFE verwende und vm = das, wie von John Papa vorgeschlagen. Alle Methoden/Eigenschaften sind an vm angehängt, nicht an $ scope. – Shaggy13spe
Ich folge auch John Papas Style Guide. dies ist root scope am sprechen, sorry, ich habe es versäumt zu erwähnen. injiziere rootscope und mache so etwas: $ scope = $ rootScope. $ new(); –
Ah ja, muss in einem Post-Lunch-Koma sein. wie auch immer, es hat funktioniert. vergaß, dass ich in den Tests $ rootScope injizieren musste. Wie auch immer, danke, dass es funktioniert hat. – Shaggy13spe