2016-03-23 3 views
0

Ich versuche einen Integrationstest mit Karma zu schreiben. Ich muss einen echten http-Aufruf machen und die tatsächliche Antwort erhalten. Ich habe alle in # 1434 erwähnten Lösungen wie passthrough() und "$ httpBackend: angular.mock. $ HttpBackendProvider" in angular-mocks.js ausprobiert und keiner von ihnen hat funktioniert.Können wir einen echten http-Aufruf im Karma-Test machen?

Hier ist mein Testcode:

use strict'; 

describe('module: main, service: AuthService', function() { 
beforeEach(module('ngMockE2E')); 
// load the service's module 
beforeEach(module('main')); 
// load all the templates to prevent unexpected $http requests from ui-router 
beforeEach(module('ngHtml2Js')); 

// instantiate service 
var AuthService; 
var $q; 
var deferred; 
var $rootScope; 

var response; 

var scope, http, flush, httpBackend; 

beforeEach(inject(function ($httpBackend,AuthService,$q, $rootScope) { 
httpBackend = $httpBackend; 

AuthService = AuthService; 
$q = $q; 
$rootScope = $rootScope; 
deferred = $q.defer(); 

scope = $rootScope.$new(); 
})); 

it('should do something', function() { 
expect(!!AuthService).toBe(true); 
expect(AuthService).not.toBeNull(); 

}); 

it('verify authenticating user', function() { 
AuthService.authUser('[email protected]','abc123').then(function (result) { 
console.log("Result of successful auth user is "); 
console.log(result); 
expect(result).toEqual(true); 
done(); 
}, function (error) { 
console.log("error of failure auth user is ",error); 
expect(false).toBe(true); 
done(); 
}); 
httpBackend.whenPOST('/oauth/token').passThrough(); 
$rootScope.$digest(); 
//httpBackend.flush(); 
}); 

}); 

Es wird großartig sein, wenn jemand eine Lösung haben dafür in Karma Test

+0

Während des Tests haben wir unsere Tests wollen schnell laufen und haben keine externen Abhängigkeiten, so dass wir XHR oder JSONP Anforderungen an einen echten Server senden möchten nicht. Alles, was wir wirklich brauchen, ist zu überprüfen, ob eine bestimmte Anfrage gesendet wurde oder nicht, oder alternativ lassen Sie einfach die Anwendung Anfragen machen, antworten mit vortrainierten Antworten und bestätigen, dass das Endergebnis das ist, was wir erwarten. – user1645290

Antwort

0

echte http Aufruf zu tun, wenn eine Winkel Anwendung einige Daten von einem Server benötigt ruft es den $ http-Dienst auf, der die Anfrage über den $ httpBackend-Dienst an einen echten Server sendet. Mit Abhängigkeitsinjektion ist es einfach, $ httpBackend mock (das die gleiche API wie $ httpBackend hat) zu injizieren und es zu verwenden, um die Anfragen zu verifizieren und mit einigen Testdaten zu antworten, ohne eine Anfrage an einen echten Server zu senden.

Versuchen und ändern nach Ihren Daten,

it('verify authenticating user', 
function() { 

httpBackend.expect('POST', '/oauth/token') 
    .respond(200, "[{ success : 'true', id : 123 }]"); 

AuthService.authUser('[email protected]', 'abc123') 
    .then(function(data) { 
    expect(data.success).toBeTruthy(); 
}); 

$httpBackend.flush(); 
}); 
Verwandte Themen