Ünite-test söz tabanlı kod Açısal olarak
Zor zamanlar söz tabanlı test etmeye Açısal kod geçiriyorum.
Benim denetleyicisi içinde aşağıdaki kodu var:
$scope.markAsDone = function(taskId) {
tasksService.removeAndGetNext(taskId).then(function(nextTask) {
goTo(nextTask);
})
};
function goTo(nextTask) {
$location.path(...);
}
Ünite-test aşağıdaki durumlarda etmek istiyorum:
markAsDone
çağrıldığındatasksService.removeAndGetNext
AratasksService.removeAndGetNext
bittiğinde konumu (goTo
çağırmak) değiştirmek gerekir
Bu iki olgu ayrı ayrı test etmek için kolay bir yolu yok gibi geliyor bana.
İlk test etmek için ne yaptım, oldu:
var noopPromise= {then: function() {}}
spyOn(tasksService, 'removeAndGetNext').andReturn(noopPromise);
Şimdi başka bir sahte oluşturmak gerek ikinci durumda test etmek için her zaman resolved
olacağına söz ver. Tüm oldukça sıkıcı ve klişe bir sürü kod.
Bu tür şeyleri test etmek için başka bir yol var mı? Ya benim tasarım kokuyor?
CEVAP
Hala hizmetleri ve dönüş söz alay gerekir, ama onun işlevselliğini uygulamak gerek yok yani gerçek sözler yerine kullanmalısınız. Eğer her ZAMAN çözülmesi gerekiyorsa beforeEach
zaten yerine söz oluşturmak ve hizmeti alay etmek için kullanın.
var $rootScope;
beforeEach(inject(function(_$rootScope_, $q) {
$rootScope = _$rootScope_;
var deferred = $q.defer();
deferred.resolve('somevalue'); // always resolved, you can do it from your spec
// jasmine 2.0
spyOn(tasksService, 'removeAndGetNext').and.returnValue(deferred.promise);
// jasmine 1.3
//spyOn(tasksService, 'removeAndGetNext').andReturn(deferred.promise);
}));
Eğer biraz daha farklı bir değer ile it
Her blokta çözmek için tercih ederseniz, o zaman sadece yerel bir değişken için ertelenmiş göstermek ve bunu çözmek spec.
Tabii ki, onlar gibi testlerinizi tutmak istiyorsunuz, ama burada çok basit bir işe yarayacağını göstermek için bazı spec.
it ('should test receive the fulfilled promise', function() {
var result;
tasksService.removeAndGetNext().then(function(returnFromPromise) {
result = returnFromPromise;
});
$rootScope.$apply(); // promises are resolved/dispatched only on next $digest cycle
expect(result).toBe('somevalue');
});
Ünite-test yönergesi denetleyicileri A...
AngularJS : ng-bind daha iyi olduğunu ...
Nasıl Facebook Test Yerel olarak Bağla...
Açısal döner test hizmeti tanımlanmamı...
-≫ olmamalı: Android web görünümü J...