2014-09-10 22 views
7

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

+1

können Sie versuchen, Sie erwarten * nach * $ httpBackend.flush()? – meriadec

+1

Sie müssen es spülen, bevor Sie die Änderungen erwarten. – PSL

Antwort

7

Sie müssen die Anweisung httpLocalBackend.flush() vor expect ($ scope.stuff.length) .toBe (2) platzieren. Sobald Sie eine Anfrage gestellt haben, müssen Sie sie löschen, damit die Daten in Ihrem Client-Code verfügbar sind.

it('should get stuff', function() { 
    var url = '/api/roles'; 
    var httpResponse = [{ "stuffId": 1 }, { "stuffId": 2 }]; 
    scope.getStuff(); //Just moved this from after expectGET 
    httpLocalBackend.expectGET(url).respond(200, httpResponse); 
    httpLocalBackend.flush(); 
    expect($scope.stuff.length).toBe(2); 
}); 

bereits.

+0

Fehler: Unerwartete Anforderung: GET/api/stuff Keine Anfrage – Timothy

+1

erwartete ich habe ein Beispiel, das wie folgt funktioniert: 1) Ich rufe die Funktion, einen get antrag wie scope.functionThatMakesAGetRequest() 2) Dann habe ich etwas wie dieses: $ httpBackend.expect ('GET',/einige/url/'+ Daten) .respond (200, {response_data: false}); 3) Dann mache ich $ httpBackend.flush(); –

+1

Sorry, können Sie auch versuchen, scope.getStuff() vor dem expectGET zu setzen? Für mich geht das. –

Verwandte Themen