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

  • graham025

    graham025

    25 NİSAN 2006
  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011