Ich kann meinen Komponententest nicht ordnungsgemäß ausführen. Ich habe ein $ scope-Array, das leer anfängt, aber sollte mit einem $ http.get() gefüllt werden. In der realen Umgebung gibt es ca. 15 oder so Objekte im Array sein würde, aber für meinen Unit-Test Ich nahm nur 2. Für den Unit-Test, ich habe:
expect($scope.stuff.length).toBe(2);
Aber Jasmins Fehler: 0 Erwartete 2.
hier ist mein controller.js zu sein:
$scope.stuff = [];
$scope.getStuff = function() {
var url = site.root + 'api/stuff';
$http.get(url)
.success(function (data) {
$scope.stuff = data;
})
.error(function(error) {
console.log(error);
});
};
und meine controller.spec.js ist:
/// <reference path="../../../scripts/angular-loader.min.js" />
/// <reference path="../../../scripts/angular.min.js" />
/// <reference path="../../../scripts/angular-mocks.js" />
/// <reference path="../../../scripts/angular-resource.js" />
/// <reference path="../../../scripts/controller.js" />
beforeEach(module('ui.router'));
beforeEach(module('ngResource'));
beforeEach(module('ngMockE2E'));
beforeEach(module('myApplication'));
var $scope;
var controller;
var httpLocalBackend;
beforeEach(inject(function ($rootScope, $controller, $injector) {
$scope = $rootScope.$new();
controller = $controller("StuffController", {
$scope: $scope
});
}));
beforeEach(inject(function ($httpBackend) {
httpLocalBackend = $httpBackend;
}));
it('should get stuff', function() {
var url = '/api/stuff';
var httpResponse = [{ "stuffId": 1 }, { "stuffId": 2 }];
httpLocalBackend.expectGET(url).respond(200, httpResponse);
$scope.getStuff();
expect($scope.stuff.length).toBe(2);
//httpLocalBackend.flush();
});
Nun, offensichtlich habe ich Variablennamen geändert und so, da dies für die Arbeit ist, aber hoffentlich ist das genug Information für jeden, der mir hilft. Ich kann mehr zur Verfügung stellen, wenn nötig. Ich bekomme auch einen zweiten Fehler, wenn ich die .flush() Zeile auskommentiere, aber ich komme später dazu.
Jede Hilfe wird sehr geschätzt und danke im Voraus!
EDIT:
Endlich hat es funktioniert! Hier ist mein letzter Code:
it('should get stuff', function() {
var url = '/api/stuff';
var httpResponse = [{ "stuffId": 1 }, { "stuffId": 2 }];
httpLocalBackend.expectGET(url).respond(200, httpResponse);
$scope.getStuff();
httpLocalBackend.flush();
expect($scope.stuff.length).toBe(2);
});
EDIT 2: ich in ein anderes Problem lief, was ich denke, kann die diese Ursache für gewesen sein. Siehe Unit test failing when function called on startup
können Sie versuchen, Sie erwarten * nach * $ httpBackend.flush()? – meriadec
Sie müssen es spülen, bevor Sie die Änderungen erwarten. – PSL