2012-07-12 21 views
21

Kendim oluşturduğum bir hizmete bağlı bir denetleyiciyi test etmeye çalışıyorum. Hizmet, DOM ile görüştüğü için bu hizmetle dalga geçmek isterim.Bir angularjs denetleyici sınaması için bir sahte hizmet enjekte etme

describe('Player Controllers', function() { 

    beforeEach(function() { 
     this.addMatchers({ 
      toEqualData: function (expected) { 
       return angular.equals(this.actual, expected); 
      } 
     }); 
    }); 

    describe('TestPSPlayerModule', function() { 
     var $httpBackend, scope, ctrl; 

     beforeEach(module('PSPlayerModule')); 

     beforeEach(inject(function (_$httpBackend_, $rootScope, $controller) { 
      $httpBackend = _$httpBackend_; 

      scope = $rootScope.$new(); 
      ctrl = $controller(PlayerController, { $scope: scope }); 
     })); 

     it('should request a clip url from the server when clipClicked is called', function() { 
      expect(1).toBe(1); 
     }); 
    }); 

}); 

Benim denetleyicisi şuna benzer::

İşte benim şimdiki testi var

w.PlayerController = function ($scope, $http, $window, speedSlider, $location) { 
    ... 
} 

yüzden ben taklit istiyor speedSlider bu.

Hız kaydırıcı bir sahte uygulama sağlayabilir ben benim test kodda oluşturulan bir modül kullanmak fikri vardı, bu yüzden test.js dosyanın üstüne aşağıdaki eklendi:

module('TestPSPlayerModule', []).factory('speedSlider', function() { 
    return = { 
     ... 
    }; 
}); 

ve sonra yerine beton birinin diyoruz) beforeEach bu modül (listelemek ama aşağıdaki hatayı alıyorum bunu yaparsan:

Injector already created, can not register a module! 

yüzden anlamaya bana temin etmek için daha iyi bir yolu olmalı hizmetlerimden birinin sahte uygulaması. Belki bir şey için sinon.js'yi kullanabilirim ....

+0

Bu belgeyi gördünüz mü? http://docs.angularjs.org/guide/dev_guide.services.testing_services '$ window' alay edildi. Bu oldukça basit bir örnektir, ancak yapmak istediğiniz şey için bir şablon sağlayabilir. –

+0

@NoahFreitas Sağladığınız bağlantı artık öldü – Stephane

+1

@StephaneEybert, şuraya taşındı ve burada güncellendi: https://docs.angularjs.org/guide/services#unit-testing –

cevap

6

Tanımından sonra modül ek parantez olmadığından emin olun. module('TestPSPlayer',[]) yerine module('TestPSPlayer'). Ayrıca

40

Bir iğne işlev çağrısı içinde bunu yapmak için çalışmıyoruz emin olun: Bu hata atmak olacaktır

:

beforeEach(inject(function(someOtherService) { 
     module('theApp', function($provide) { 
      myMock = {foo: 'bar'}; 
      $provide.value('myService', myServiceMock); 
      someOtherService.doSomething(); 
     }); 
    })); 

Bu olmaz:

beforeEach(function() { 
     module('theApp', function($provide) { 
      myMock = {foo: 'bar'}; 
      $provide.value('myService', myServiceMock); 
     }); 

     inject(function(someOtherService) { 
      someOtherService.doSomething(); 
     }); 
    }); 
+0

daha alakalı imho – davidjnelson

+7

Yuvalama modülü () '' inject() 'hataya neden olmaz. Aslında, tüm '' '' '(' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' 'olmalıdır. –

+0

@HermanKan neden? – tobi

4

yılında Benim durumum bu işe yaramadı:

beforeEach(module('user')); 
beforeEach(inject(function ($http) { 
})); 

beforeEach(module('community')); 
beforeEach(inject(function ($controller, $rootScope) { 
})); 
Bunun için değiştirdik

Çalışma yapmak için:

beforeEach(module('user')); 
beforeEach(module('community')); 

beforeEach(inject(function ($http) { 
})); 
beforeEach(inject(function ($controller, $rootScope) { 
})); 
+0

, bu, tüm modül başlatıldıktan sonra enjekte çağrılması gerektiğini açıklar. –

0

orijinal enjekte sağlayıcı kullanmak ve onu taklit init'i sağlayıcı küresel kullanmıyorsa. Aşağıdaki örnekte , testProvider aşağıdaki kontrol cihazınızdır.

var injectedProviderMock; 

beforeEach(function() { 
    module('myModule'); 
}); 

beforeEach(inject(function (_injected_) { 
    injectedProviderMock = mock(_injected_); 
})); 


var testedProvider; 
beforeEach(inject(function (_testedProvider_) { 
    testedProvider = _testedProvider_; 
})); 

it("return value from injected provider", function() { 
    injectedProviderMock.myFunc.andReturn('testvalue'); 
    var res = testedProvider.executeMyFuncFromInjected(); 
    expect(res).toBe('testvalue'); 
}); 

//mock all provider's methods 
function mock(angularProviderToMock) { 

    for (var i = 0; i < Object.getOwnPropertyNames(angularProviderToMock).length; i++) { 
     spyOn(angularProviderToMock,Object.getOwnPropertyNames(angularProviderToMock)[i]); 
    } 
    return angularProviderToMock; 
} 
İlgili konular