SORU
22 EKİM 2012, PAZARTESİ


Nasıl Yasemin ile AngularJS bir hizmet test edebilirim?

(İlgili burada bir soru var: Jasmine test does not see AngularJS module)

Ben sadece Açısal önyükleme olmadan bir hizmeti test etmek istiyorum.

Bazı örnekler ve öğretici bakmak zorundayım ama bir yere gitmiyorum.

Sadece üç dosya var:

  • ben AngularJS hizmeti tanımlayın . myService.js:

  • ben hizmet için Yasemin bir test tanımlayın. test_myService.js:

  • specRunner.html bir HTML normal yasemin yapılandırma dosyası ve önceki iki diğer dosyaları ve Yasemin ben alma nerede, Angularjs ve angular-mocks.js.

Bu hizmeti (test olduğum zaman beklendiği gibi çalışır) kodu:

var myModule = angular.module('myModule', []);

myModule.factory('myService', function(){

    var serviceImplementation   = {};
    serviceImplementation.one   = 1;
    serviceImplementation.two   = 2;
    serviceImplementation.three = 3;

    return serviceImplementation

});

İzolasyon hizmetini test etmeye çalışıyorum, erişim ve yöntemlerini kontrol etmek gerekir. Benim soru: nasıl AngularJS önyükleme olmadan benim test hizmeti enjekte edebilir miyim?

Örneğin, nasıl değer böyle: Yasemin ile hizmeti yöntemi için verilen test edebilirim

describe('myService test', function(){
    describe('when I call myService.one', function(){
        it('returns 1', function(){
            myModule = angular.module('myModule');
                    //something is missing here..
            expect( myService.one ).toEqual(1);
        })

    })

});

Şimdiden teşekkürler.

CEVAP
23 EKİM 2012, Salı


Sorun hizmeti başlatılamadı fabrika yöntemi, yukarıdaki örnekte (modül hizmeti başlatılamadı değil sadece oluşturma) denir.

Örneği hizmet için angular.injector bizim hizmet tanımlandığı modülü ile " olması gerekiyor. Sonra, yeni enjektör hizmet için nesne ve hizmetine nihayet örneği onun sadece o zaman sorabiliriz.

Bu çalışıyor gibi bir şey:

describe('myService test', function(){
    describe('when I call myService.one', function(){
        it('returns 1', function(){
            var $injector = angular.injector([ 'myModule' ]);
            var myService = $injector.get( 'myService' );
            expect( myService.one ).toEqual(1);
        })

    })

});

Başka bir işleve hizmet kullanarak olmamakla 'invoke':

describe('myService test', function(){
    describe('when I call myService.one', function(){
        it('returns 1', function(){

            myTestFunction = function(aService){
                expect( aService.one ).toEqual(1);
            }

            //we only need the following line if the name of the 
            //parameter in myTestFunction is not 'myService' or if
            //the code is going to be minify.
            myTestFunction.$inject = [ 'myService' ];

            var myInjector = angular.injector([ 'myModule' ]);
            myInjector.invoke( myTestFunction );
        })

    })

});

Ve, son olarak, 'uygun' bir şekilde kullanıyor 'inject' ve 'module' 'beforeEach' yasemin blok. Bunu yaparken 'ngMock modülünde standart angularjs paketinde, ama değil ve sadece yasemin ile çalışır. bu fonksiyon enjekte fark var

describe('myService test', function(){
    describe('when I call myService.one', function(){
        beforeEach(module('myModule'));
        it('returns 1', inject(function(myService){ //parameter name = service name

            expect( myService.one ).toEqual(1);

        }))

    })

});

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InfinityWard

    InfinityWard

    19 EYLÜL 2006
  • njhaley

    njhaley

    24 NİSAN 2006
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006