SORU
16 Mayıs 2014, Cuma


Nasıl alay Angularjs söz veren bir servis Yasemin birim test edebilirim?

Uzak bir çağrı yapar myOtherService, kullanan başlatılıyor, sözünü geri verecekti:

angular.module('app.myService', ['app.myOtherService'])
  .factory('myService', [myOtherService,

    function(myOtherService) {
      function makeRemoteCall() {
        return myOtherService.makeRemoteCallReturningPromise();
      }

      return {
        makeRemoteCall: makeRemoteCall
      };      
    }
  ])

Bir birim myService ben test yapmak için myOtherService, makeRemoteCallReturningPromise() yöntemi bir söz verir gibi alay gerekiyor. Ben böyle severim

describe('Testing remote call returning promise', function() {
  var myService;
  var myOtherServiceMock = {};

  beforeEach(module('app.myService'));

  // I have to inject mock when calling module(),
  // and module() should come before any inject()
  beforeEach(module(function ($provide) {
    $provide.value('myOtherService', myOtherServiceMock);
  }));

  // However, in order to properly construct my mock
  // I need $q, which can give me a promise
  beforeEach(inject( function(_myService_, $q){
    myService = _myService_;
    myOtherServiceMock = {
      makeRemoteCallReturningPromise: function() {
        var deferred = $q.defer();
        deferred.resolve('Remote call result');
        return deferred.promise;
      }    
    };
  }

  // Here the value of myOtherServiceMock is not
  // updated, and it is still {}
  it('can do remote call', inject(function() {
    myService.makeRemoteCall() // Error: makeRemoteCall() is not defined on {}
      .then(function() {
        console.log('Success');
      });    
  }));  

Yukarıda da görebileceğiniz gibi, benim alay tanımı yüklenemedi: var $q inject() kullanarak bağlıdır. Ayrıca, sahte enjekte önce geliyor olmalı module() Bir şeyler olabilir. inject(). Ancak, sahte değeri değiştirdim bir kez güncellenir.

Bunu yapmak için doğru yolu nedir?

CEVAP
16 Mayıs 2014, Cuma


Senin yaptığın gibi çalışmıyor neden emin değilim, ama genellikle spyOn fonksiyonu ile bunu. Şöyle bir şey:

describe('Testing remote call returning promise', function() {
  var myService;

  beforeEach(module('app.myService'));

  beforeEach(inject( function(_myService_, myOtherService, $q){
    myService = _myService_;
    spyOn(myOtherService, "makeRemoteCallReturningPromise").and.callFake(function() {
        var deferred = $q.defer();
        deferred.resolve('Remote call result');
        return deferred.promise;
    });
  }

  it('can do remote call', inject(function() {
    myService.makeRemoteCall()
      .then(function() {
        console.log('Success');
      });    
  }));

Ayrıca çağrılacak then işlevi $digest bir çağrı yapmak gerektiğini unutmayın. BakınTest$q documentation bölüm.

------EDİT------

Daha yakın ne yaptığını baktıktan sonra kodunuzda sorun görüyorum. beforeEach yepyeni bir nesneye myOtherServiceMock oluyorsun. $provide hiç bu başvuru göreceksiniz. Sen sadece var olan referans güncellemeniz gerekir:

beforeEach(inject( function(_myService_, $q){
    myService = _myService_;
    myOtherServiceMock.makeRemoteCallReturningPromise = function() {
        var deferred = $q.defer();
        deferred.resolve('Remote call result');
        return deferred.promise;   
    };
  }

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • FUNKER530 - Veteran Community & Combat Footage

    FUNKER530 -

    25 Ocak 2007
  • The Brister

    The Brister

    10 ŞUBAT 2008