Les tests API backend via $http, dans AngularJS/karma/jasmin tests?
Comment puis-je tester mon API backend en utilisant AngularJS/karma/jasmin tests?
J'ai essayé de créer le plus petit test montrant mon erreur:
echo_server.py
from bottle import response, route, run
@route('/echo/<echo>')
def echo_echo(echo):
response.headers['Access-Control-Allow-Origin'] = '*'
return {'echo': echo} # Served as JSON
if __name__ == '__main__':
run()
test/unit/apiSpec.js
//Should this be in `test/e2e/apiSpec.js`?
describe('echo', function () {
var scope, http;
beforeEach(inject(function ($rootScope, $http) {
$http.defaults.useXDomain = true; //CORS
scope = $rootScope.$new();
http = $http;
}));
it("should echo from server", function () {
scope.$apply(function () {
var ret;
http.get("http://localhost:8080/echo/foo")
.success(function (data, status, headers, config) {
ret = data;
})
.error(function (data, status, headers, config) {
ret = data;
});
console.log('ret = ' + ret);
expect(ret.echo).toBe("foo");
});
});
});
Sortie de karma start configs/karma.conf.js
INFO [karma]: Karma v0.10.8 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.2 (Linux)]: Connected on socket m7imfgmhXdOY9JVKJh8r
LOG: 'ret = undefined'
PhantomJS 1.9.2 (Linux) echo should echo from server FAILED
Error: Unexpected request: GET http://localhost:8080/echo/foo
No more request expected
at $httpBackend (~Projects/~karma-tests/test/lib/angular/angular-mocks.js:1178)
...
Pourquoi voudriez-vous utiliser angularJS et karma pour tester un backend. AngularJS et Karma sont tous sur le front-end. Vous n'avez pas besoin d'un navigateur pour envoyer une requête HTTP à un serveur. Et anguleuses se moque de est précisément utilisé pour se moquer d'un arrière-plan, de sorte que vous ne pouvez pas l'utiliser pour tester votre vrai backend.
Avantage de mettre tous mes tests en un seul endroit, c'est que quand ils passent; je peux déployer pour la mise en scène. I. e.: l'essai de serveur en cours d'exécution durant tout le développement.
J'ai des tests unitaires et des tests d'intégration de l'écrit en Java pour mon backend, les tests unitaires écrits en JavaScript avec le Karma et e2e tests écrits en JavaScript angulaire rapporteur pour l'angle d'frontend, et je peux construire et tester tout (à l'aide de gradle) avec une seule commande. Mon serveur CI aussi est-il à chaque poussée. Utiliser le bon outil pour le bon travail ne doivent pas empêcher les uoi de l'exécution de tous les tests et seulement si le déploiement de tous les tests passent.
Bien sûr, mais si je fais que des tests Reposant, JavaScript doit être fine...
Je ne dis pas de ne pas utiliser de JavaScript. Karma et angulaire se moque de qui ne sont pas appropriés. Je suis sûr que quelque chose existe dans le NodeJS écosystème de tester une bonne backend, mais je ne sais pas assez bien pour suggérer quelque chose.
Avantage de mettre tous mes tests en un seul endroit, c'est que quand ils passent; je peux déployer pour la mise en scène. I. e.: l'essai de serveur en cours d'exécution durant tout le développement.
J'ai des tests unitaires et des tests d'intégration de l'écrit en Java pour mon backend, les tests unitaires écrits en JavaScript avec le Karma et e2e tests écrits en JavaScript angulaire rapporteur pour l'angle d'frontend, et je peux construire et tester tout (à l'aide de gradle) avec une seule commande. Mon serveur CI aussi est-il à chaque poussée. Utiliser le bon outil pour le bon travail ne doivent pas empêcher les uoi de l'exécution de tous les tests et seulement si le déploiement de tous les tests passent.
Bien sûr, mais si je fais que des tests Reposant, JavaScript doit être fine...
Je ne dis pas de ne pas utiliser de JavaScript. Karma et angulaire se moque de qui ne sont pas appropriés. Je suis sûr que quelque chose existe dans le NodeJS écosystème de tester une bonne backend, mais je ne sais pas assez bien pour suggérer quelque chose.
OriginalL'auteur A T | 2013-12-22
Vous devez vous connecter pour publier un commentaire.
Mentionnés test de la pile n'est pas prévu pour l'utilisation de cette façon. La demande n'est jamais distribué en raison de la
$httpMockBackend
qui a été décoré sur le dessus de votre original$httpBackend
.Pour autoriser les demandes à passer par vous soit nécessaire d'exclure
angular-mocks.js
, ou de spécifier que certaines url de passer à travers comme ceci:Lire la documentation pour
$httpMockBackend
iciAussi, votre test est synchrone, et la réponse du serveur est un système, de sorte qu'il ne fonctionne pas comme prévu.
$httpBackend.whenGET(/.*/)
n'est pas a un.passThrough()
méthode ?!$httpBackend peut être utilisé via
ngMock
oungMockE2E
..mais il se comporte différemment. ngMockE2E .passThrough() . Vous pourriez avoir un coup d'oeil à différencesOriginalL'auteur Kenneth Lynne