2016-03-25 4 views
1

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

Я использую Жасмин и Карму тестов автоматизированы с Глотком
Ошибки я получаю "Неизвестный поставщик: ProductServiceProvider < - ProductService"

I изменили тесты на устранение неполадок здесь, это простые версии.

Если я прокомментирую следующую строку в файле 2, оба файла пройдут.

angular.module('eu.product.service', []); 

Это как-то связано с насмешкой над модулем, но я не могу понять, что я здесь делаю неправильно.

спецификации файла 1

describe('Testing euProduct', function(){ 

var $factory; 
var $httpBackend; 

beforeEach(function() { 

    //modules 
    module('eu.product.service'); 

    //injections 
    inject(function($injector){ 
     $factory = $injector.get('ProductService'); 
     $httpBackend = $injector.get('$httpBackend'); 
    }); 

    //mock data 
    $httpBackend.when('GET', '/Mercury/product/list/0/0?PrimaryCategoryID=0&pageSize=20&startPage=1').respond({ 
     "data": 
      [{ 
       "recallid":45, 
      }] 
    }); 

}); 

afterEach(function() { 
    $httpBackend.verifyNoOutstandingExpectation(); 
    $httpBackend.verifyNoOutstandingRequest(); 
}); 
//-----Tests---- 

it('Should be able to get data from the server on default parameters.', function(){ 
    $factory.list({},function(data){ 
     expect(data.data[0].recallid).toBe(45); 
    }); 
    $httpBackend.flush(); 
}); 

}); 

Spec Файл 2

'use strict'; 

описывают ('Тестирование euProduct логики', функция() {

//variables in closure scope so they can be used in tested but set with injection in beforeEach 
var $factory; 

//mocking a module :: http://www.sitepoint.com/mocking-dependencies-angularjs-tests/ 
beforeEach(function() { 
    angular.module('eu.product.service',[]); 

    module(function($provide) { 
     $provide.factory('ProductService', function() { 
      // Mocking utilSvc 
      return { 
       list : function(para, callback){ 
        callback({ 
         data : { 
          product : 'The product Name' 
         } 
        }) 
       } 
      }; 
     }); 

     $provide.service('storageSvc', function() { 
      // Mocking storageSvc 
     }); 
    }); 

    //modules 
    module('eu.product.logic'); 

    //injections 
    inject(function($injector){ 
     $factory = $injector.get('ProductLogic'); 
    }); 

}); 

//-----Tests---- 

it('Should be able to run tests', function(){ 
    expect(2).toBe(2); 
}); 
}); 
+0

сделать загрузочный модуль, как этот 'angular.module («eu.product.service»)' –

+0

я стреляю за насмешливый модуль не импортировать его, так что если есть ошибка с ЕС. module.service он не будет отображаться в тесте eu.service.logic. Как бы вы издевались над этим, а затем импортировали его. –

+0

так, как вы сейчас это делаете, создавая новый модуль, который вымывает все зарегистрированные его компоненты .. что вы хотели высмеять в 'eu.product.service'? –

ответ

1

Оба module и inject от angular-mocks возвращения функции, которые необходимо назвать.

В следующем примере я сделал эти изменения:

  • Refactor к основному рабочему примеру
  • Не определять пользовательские $ -prefixed переменные. Они зарезервированы угловыми.
  • Используйте inject для инъекций вместо $injector.
  • Добавить комментарии для дальнейшего объяснения.

    describe('ProductService', function() { 
        var ProductService; 
        var $httpBackend; 
    
        // Start module config phase. 
        beforeEach(module('eu.produce.service', function($provide) { 
         // Inject providers/override constants here. 
         // If this function is empty, it may be left out. 
        })) 
    
        // Kickstart the app and inject services. 
        beforeEach(inject(function(_ProductService_, _$httpBackend_){ 
         ProductService = _ProductService_; 
         $httpBackend = _$httpBackend_; 
        }); 
    
        beforeEach(function() { 
         // Optionally use another beforeEach block to setup services, register spies, etc. 
         // This can be moved inside of the inject function as well if you prefer. 
         //mock data 
         $httpBackend.when('GET', '/Mercury/product/list/0/0?PrimaryCategoryID=0&pageSize=20&startPage=1').respond({ 
          "data": 
           [{ 
            "recallid":45, 
           }] 
         }); 
        }); 
    
        afterEach(function() { 
         $httpBackend.verifyNoOutstandingExpectation(); 
         $httpBackend.verifyNoOutstandingRequest(); 
        }); 
    
        //-----Tests---- 
    
        it('Should be able to get data from the server on default parameters.', function(){ 
         ProductService.list({},function(data){ 
          expect(data.data[0].recallid).toBe(45); 
         }); 
         $httpBackend.flush(); 
        }); 
    });