SORU
18 NİSAN 2013, PERŞEMBE


Ü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ığında tasksService.removeAndGetNext Ara
  • tasksService.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
18 NİSAN 2013, PERŞEMBE


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');
});

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • EEVblog

    EEVblog

    4 NİSAN 2009
  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012