如何使用Jasmine和Karma将实际依赖项加载到Angularjs测试中?

时间:2016-03-01 00:23:11

标签: javascript angularjs unit-testing jasmine karma-jasmine

我一直在网上寻找,但似乎没有人真正将实际的依赖注入到使用Jasmine和Karma的Angularjs的单元测试中。

我认为测试过程肯定存在分离,但我也想知道它如何与当前使用的依赖项很好地集成...所以,以防依赖关系不能很好地与我的组件一起工作,我会意识到的!

所以,我想知道如何注入实际的依赖项?到目前为止,我发现在线文章都是关于用假的嘲笑它...但我想使用实际的文章。现在,当我输入karma start时,我收到错误Error: [$injector:unpr] Unknown provider: _Provider <- _ <-MyService

我在forEach块注入服务,就像这样

beforeEach(angular.mock.inject(function(_MyService_) {

我想知道是不是因为我没有使用虚假服务?

describe('MyCtrl', function() {

  //Data Exposure Prep
  var $controller;
  var $rootScope;
  var $scope;
  var controller;
  var MyService;

  dd1 = {
    itinerary: globalMockData.d1,//I stored globalMockData somewhere else
  };

  beforeEach(angular.mock.module('myapp'));
  beforeEach(angular.mock.inject(function(_$rootScope_, _$controller_, _$httpBackend_) {
    $rootScope = _$rootScope_;
    $controller = _$controller_;
    $httpBackend = _$httpBackend_;
    $scope = $rootScope.$new();
    controller = $controller('MyCtrl', { $scope: $scope }, dd1);
  }));

  //BASIC INFO
  describe('should receive sth', function() {
    it('finds sth', function() {
      expect(controller.answer).toBeDefined();
    });
  });

});

1 个答案:

答案 0 :(得分:-1)

这实际上取决于您的Controlller实施。 如果你正在使用示波器,你可能想要在控制器的范围内测试,而不是在控制器本身上测试。

使用$ scope测试控制器

function MyController($scope, MyService) {
 $scope.greetUpperCase = function(name) {
  return MyService.greet(name).toUpperCase();
 }
}

基本上,当你使用$ scope时,你并不真正关心控制器本身,因为它正在做它的范围内的所有事情。

所以,我们需要:

注入$ rootScope 创建一个新的范围 将它注入新的控制器 测试$ scope

it('test greetUpperCase()', function() {
 var myScope = $rootScope.$new();
 $controller('MyController', {
  $scope: myScope
 });
 expect(myScope .greetUpperCase('bob')).toBe('HELLO BOB');
});

https://jsfiddle.net/ronapelbaum/pkhaxmdg/