2014-10-17 9 views
8

Ich habe ein Projekt mit AngularAMD/RequireJS/Karma/Jasmine, das ich habe die Grundkonfiguration alle arbeiten, die meisten Komponententests laufen und erfolgreich bestanden.Wie Service in angularAMD mit Karma/Jasmin verspotten?

Ich kann nicht einen verspotteten Service korrekt injiziert mit entweder angular.mock.module oder angularAMD.value().

ich habe:

// 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>'); 
       }); 
      }); 
     } 
); 

Weiß jemand, wo ich falsch gehe? Jede Hilfe würde sehr geschätzt werden.

+0

werfen Sie einen Blick auf angularamds Git, es gibt einige gute Testbeispiele. –

Antwort

0

Angular ist nicht asynchron, ich denke, ist nicht eine gute ideia verwenden beide. Wenn Sie versuchen, eine gute Modularisierungsmethode zu erreichen, okay, aber den RequireJS-Optimierer verwenden, um alles zu erstellen, bevor Sie dies auf Ihren Browser setzen, und über die Tests, können Sie den RequireJS-Optimierer einfach verwenden, um Ihre Module zu erstellen. es wird dich von "CommonJS-Umgebung sogar in Tests" befreien.

0

Sieht aus wie es ein Problem mit variablen Bereichen sein wird, ist Karma sehr feindselig darüber. Ich denke, du solltest deine Mock-Objekte global initialisieren und sie dann in den beforeEach-Bereich setzen.

Die obere Zeile meiner Testdateien sieht immer so etwas wie:

var bodyMock, svcMock, foo, bar

Dann in den beforeEach'es habe ich die Werte

Edit: Da bodyMock ist nur eine Bereichsvariable, an dem Punkt, an dem die Tests tatsächlich ausgeführt werden und der Browser nach einem Objekt 'bodyMock' sucht, kann nichts gefunden werden.