2014-10-17 3 views
8

У меня есть проект, использующий AngularAMD/RequireJS/Karma/Jasmine, что у меня есть основная конфигурация, все работают, большинство модульных тестов запускаются и проходят успешно.Как издеваться над сервисом в angularAMD с кармой/жасмином?

Я не могу получить издеваемое обслуживание, введенное правильно, используя либо angular.mockule, либо angularAMD.value().

у меня есть:

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

Кто-нибудь знает, где я неправильно? Любая помощь приветствуется.

+0

посмотрите на gular, это хорошие примеры тестов. –

ответ

0

Угловой не является асинхронным, я думаю, что это не хорошая идеализация, использующая оба. Если вы пытаетесь найти хороший метод модуляции, хорошо, но используйте оптимизатор RequireJS для создания всего, прежде чем вы разместите его в своем браузере, и о тестах, я думаю, вы можете просто использовать оптимизатор RequireJS для сборки своих модулей раньше, он позволит вам освободиться от среды CommonJS даже в тестах.

0

Похоже, что это будет проблема с переменными областями, карма очень тонкая. Я думаю, вы должны инициализировать свои макетные объекты по всему миру, а затем установить их в beforeEach.

Верхняя строка из моих тестовых файлов всегда выглядит что-то вроде:

вара bodyMock, svcMock, Foo, бар

Тогда в beforeEach'es я устанавливаю значение

Edit: С bodyMock это только переменная области видимости, в точке, где тесты фактически выполняются, и браузер ищет объект bodyMock, он ничего не может найти.

Смежные вопросы