Tests unitaires dans AngularJS - Services de moquerie et promesses

Angulaire tout semble avoir une courbe d'apprentissage abrupte et tests unitaires Angulaire app certainement ne pas à échapper à ce paradigme.

Quand j'ai commencé avec le TDD et Angulaire j'ai senti que je passais deux fois (peut-être plus autant de temps à essayer de comprendre exactement comment le tester et peut-être même plus juste obtenir mes tests correctement configuré. Mais comme Ben Nadel de le mettre dans son blog il y a des hauts et des bas dans l'angle de processus d'apprentissage. Son graphe est certainement mon expérience Angulaire.

Cependant, comme j'ai progressé dans l'apprentissage des angles et tests unitaires ainsi, maintenant j'ai l'impression de passer beaucoup moins de temps la mise en place de tests et beaucoup plus de temps à faire des tests de passer du rouge au vert - qui est un bon sentiment.

Donc je suis venu à travers différentes méthodes de configuration de mon test de l'unité de se moquer des services et des promesses et j'ai pensé que je voudrais partager ce que j'ai appris et aussi poser la question de:

Existe-il des autres ou de meilleures façons d'accomplir cela?

Donc sur le code, que ce que nous venons tous ici, de toute façon - ne pas écouter quelqu'un parler de son amour, err réalisations de l'apprentissage d'un framework.

C'est de cette façon que j'ai commencé se moquant de mes services et de promesses, je vais utiliser un contrôleur, mais les services et les promesses peuvent être moqué dans d'autres endroits, évidemment.

describe('Controller: Products', function () {
var//iable declarations
$scope,
$rootScope,
ProductsMock = {
getProducts: function () {
} //There might be other methods as well but I'll stick to one for the sake of consiseness
},
PRODUCTS = [{},{},{}]
;
beforeEach(function () {
module('App.Controllers.Products');
});
beforeEach(inject(function ($controller, _$rootScope_) {
//Set up our mocked promise
var promise = { then: jasmine.createSpy() };
//Set up our scope
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
//Set up our spies
spyOn(ProductsMock, 'getProducts').andReturn(promise);
//Initialize the controller
$controller('ProductsController', {
$scope: $scope,
Products: ProductsMock
});
//Resolve the promise
promise.then.mostRecentCall.args[0](PRODUCTS);
}));
describe('Some Functionality', function () {
it('should do some stuff', function () {
expect('Stuff to happen');
});
});
});

Pour nous, cela a fonctionné, mais comme le temps passait, je pensais qu'il devait y avoir une meilleure façon. Pour l'une j'ai détesté le

promise.then.mostRecentCall 

choseet si nous voulions pour réinitialiser le contrôleur ensuite, nous avons dû sortir de la beforeEach bloc et de l'injecter individuellement dans chaque test.

Il y a une meilleure façon...

Maintenant, je demande quelqu'un aurait-il d'autres moyens de définir des tests, ou et de pensées ou de sentiment sur la façon dont j'ai choisi de le faire?

source d'informationauteur Sten Muchow