2014-10-17 13 views
8

Ben temel yapılandırmasını tüm çalışma olduğunu, çoğu birim testleri çalıştırmak ve başarılı bir şekilde geçmesi, AngularAMD/RequireJS/Karma/Jasmine'i kullanarak bir proje var.AngularAMD hizmetini karma/jasmine ile nasıl atarsınız?

bir alay Hizmet ya angular.mock.module veya angularAMD.value() kullanılarak doğru enjekte elde edilemez.

Ben:

// service definition in services/MyService.js 
define(['app'], 
     function(app) { 
      app.factory('myService', [ '$document', function($document) { 
       function add(html) { 
        $document.find('body').append(html); 
       } 
       return { add: add }; 
      }]); 
     } 
); 


// test 
define(['angularAMD', 'angular-mocks', 'app', 'services/MyService'], 
     function(aamd, mocks, app) { 
      describe('MyService', function() { 
       var myBodyMock = { 
        append: function() {} 
       }; 
       var myDocumentMock = { 
        find: function(sel) { 
         // this never gets called 
         console.log('selector: ' + sel); 
         return myBodyMock; 
        } 
       }; 
       var svc; 
       beforeEach(function() { 
        // try standard way to mock a service through ng-mock 
        mocks.module(function($provide) { 
         $provide.value('$document', myDocumentMock); 
        }); 
        // hedge my bets - try overriding in aamd as well as ng-mock 
        aamd.value('$document', myDocumentMock);    
       }); 
       beforeEach(function() { 
        aamd.inject(['myService', 
           function(myService) { 
            svc = myService; 
           }]); 
       }); 
       it('should work', function() { 
        // use svc expecting it to have injected mock of $document. 
        spyOn(myDocumentMock, 'find').andCallThrough(); 
        spyOn(myBodyMock, 'append'); 
        svc.add('<p></p>'); 
        expect(myDocumentMock.find).toHaveBeenCalledWith('body'); 
        expect(myBockMock.append).toHaveBeenCalledWith('<p></p>'); 
       }); 
      }); 
     } 
); 

kimse yanlış nereye gidiyorum biliyor mu? Herhangi bir yardım çok takdir edilecektir. Eğik

+0

angularamd en Git de bakabilirsiniz, bazı iyi bir test örneği vardır. –

cevap

0

Ben iyi ideia ikisini de kullanmak olmadığını düşünüyorum, asenkron değildir. İyi bir modülerleştirme yöntemine ulaşmaya çalışıyorsanız, tamam, ancak bunu tarayıcınıza koymadan önce her şeyi oluşturmak için RequireJS iyileştiricisini kullanın ve testler hakkında daha önceden modüllerinizi oluşturmak için RequireJS optimize edicisini kullanabilirsiniz. "Testlerde bile" CommonJS ortamından "kurtulacaktır.

0

değişken kapsamları ile ilgili bir sorun olacak gibi karma bu konuda çok titiz olduğunu görünüyor. Sahte nesnelerini global olarak başlatmalı, sonra onları BeforeEach'a koymalısınız.

gibi bir şey benim test dosyalarının üst satırı her zaman görünüyor: svcMock, foo bar beforeEach'es içinde Sonra

Ben değerleri

Edit

var bodyMock ayarlayın: bodyMock yana testlerin gerçekte çalıştığı ve tarayıcı 'bodyMock' nesnesini aradığı bir kapsam değişkenidir, hiçbir şey bulamaz.