2017-02-01 6 views
0

Я хотел бы спросить, как решить эту ошибку, которая не позволит мне написать какой-либо тест. Это Angularjs завод (service.es6) Я хотел бы проверить:Единичный тест на Angularjs с Jasmine и Webpack, ошибка Неизвестный поставщик

import Rx from 'rxjs/Rx' 
var TheMiddleModule = angular.module('TheMiddleModule', []) 
TheMiddleModule.factory('TheMiddleOp', function ($http){ 
    var api = 'someUrl' 
    var TheMiddleOp = {} 

    TheMiddleOp.getSsoidFromService =() => { 
    return Rx.Observable.fromPromise(
     $http({ 
      method: 'GET', 
      url: api 
     }) 
    ) 
    } 

    return TheMiddleOp 
}) 

Это моя тестовая конфигурация WebPack:

var JasmineWebpackPlugin = require('jasmine-webpack-plugin'); 
module.exports = { 
    entry: ['./app/scripts/test/service.js'], 
    plugins: [new JasmineWebpackPlugin()], 
    output: { 
     path: __dirname, 
     filename: 'test.js' 
    }, 
    module: { 
     loaders: [ 
     { 
      test: /\.es6$/, 
      exclude: /(node_modules|bower_components)/, 
      loader: 'babel?presets[]=es2015!eslint-loader' 
     }, 
     { 
      test: /\.js$/, 
      exclude: /(node_modules|bower_components)/, 
      loader: 'babel?presets[]=es2015!eslint-loader' 
     } 
    ] 
    } 
} 
}; 

и это мой JS тестовый файл:

import 'angular'; 
import 'angular-mocks'; 
import '../services/service.es6'; 

var service; 

describe('service test', function() { 
    var $httpBackend, $httpProvider; 
    var module = angular.mock.module(); 
    var url = 'someUrl'; 

    beforeEach(function() { 

     module('TheMiddleModule'); 

     inject(function (_$httpBackend_, _TheMiddleOp_) { 
      $httpBackend = _$httpBackend_; 
      service = _TheMiddleOp_; 

      $httpBackend.when('POST', url) 
      .respond(200, {'sso-id':'test'}); 
     }); 
    }); 

    it('$httpBackend should be defined', function(){ 
     expect($httpBackend).toBeDefined(); 
    }); 

    it('TheMiddleOp should be defined', function(){ 
     expect(service).toBeDefined(); 
    }); 

    it('should call the ssoid service', function(){ 
     var getFromService = service.getSsoidFromService() 
     getFromService.subscribe(
      (response) => {}, 
      (e) => {}, 
      () => { 
       $httpBackend.expectGET(url); 
       $httpBackend.flush(); 
      } 
     ) 
    }); 

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

жасмин ошибка дает мне:

Error: [$injector:unpr] Unknown provider: TheMiddleOpProvider <- TheMiddleOp 

Если я комментирую строку:

service = _TheMiddleOp_; 

за $ httpBackend тест проходит правильно и она не другие, конечно. Я также попытался импортировать service.es6 без экспорта, только с модулем в качестве экспорта по умолчанию и с большим количеством комбинаций. Заранее спасибо за любую помощь, которую вы могли бы мне дать.

ответ

0

Похоже, что ваш модуль не определен. Потому что завод зарегистрирован в этом модуле. Таким образом, ошибка указана в определении модуля.

Там может быть три вещи неправильно, если я могу догадаться:

var module = angular.mock.module(); 

Почему это необходимо? Почему бы не написать angular.mockule в каждом перед каждым?

angular.mock.module('TheMiddleModule'); 

Другой вариант - это ваш завод и выбор переменных. Мое предложение переписать его следующим образом:

angular.module('TheMiddleModule', []) 
    .factory('TheMiddleOp', function ($http){ 
    var api = 'someUrl'; 

    return { 
    getSsoidFromService =() => { 
     return Rx.Observable.fromPromise(
      $http({ 
      method: 'GET', 
      url: api 
     }); 
    ) 
    }; 
    }); 

Последний вариант заключается в неправильной конфигурации вашего веб-пакета. Но вы можете отлаживать свой тест, который вы настраиваете, чтобы он не был singleRun;

Последний комментарий, сам тест модуля ничего не тестирует; И удалите чек, если $ httpBackend есть, потому что тогда ваш тестовый угловой макет работает?

+0

Большое вам спасибо! Чтобы решить эту проблему, у меня есть: (1) написал это angular.mockule ('TheMiddleModule'); как предлагалось (2) переписал завод по предложению (3), удалил тест $ httpBackend. После этого ожидается (услуга) .toBeDefined(); прошел тест, и теперь я могу, наконец, работать над написанием фактических тестов. Еще раз спасибо! – user1308170

+0

Ваш радушный рад, что я мог бы помочь –

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

  • Нет связанных вопросов^_^