在茉莉花中嘲弄服务:缺少提供者

时间:2015-12-02 14:08:08

标签: javascript angularjs node.js unit-testing

我对单元测试很陌生。我正在编写代码。我的js文件有:

app.service("appService", function($http) {
  this.getData = function(url) {
    return $http.get(url);
  }

  this.foo = function() {
    console.log("Hello foo function");
  }
})

app.controller("productsController", ['$scope', '$http', 'appService',
  function($scope, $http, appService) {
    var pct = this;
    console.log("This is products controller");
    pct.url = "http://mysafeinfo.com/api/data?list=englishmonarchs&format=json";
    var jsonDataPromise = appService.getData(pct.url);
    jsonDataPromise
      .then(function(response) {
        pct.jsonData = response.data;
      }, function(err) {
        console.log("Error is: " + error);
      });
  }
]);

我使用jasmine框架在karma.js中进行单元测试。我把testfile.js改为:

describe('unitTesting', function() {
  var $prodScope, prodCtrl, mockService;
  beforeEach(module('sampleApp')); //Name of angular module 
  var jsonData = {
    "name": "test_name",
    "email": "test_email"
  };

  beforeEach(function() {
    mockService = jasmine.createSpyObj('appService', ['getData', 'foo']);
  })

  beforeEach(inject(function($controller, $rootScope, $httpBackend, $http, $q, mockService) {
    defer = $q.defer();
    $prodScope = $rootScope.$new();
    prodCtrl = $controller('productsController', {
      $scope: $prodScope,
      $http: $http,
      appService: mockService
    });

    spyOn(mockService, "getData").and.callFake(function() {
      return defer.promise;
    });
    spyOn(mockService, "foo");

  }));

  //Here unit tests go

})

我的问题是,当我使用karma start(我有karma.conf.js)运行测试时,我收到错误:

[$ injector:unpr]未知提供者:mockServiceProvider< - mockService。

任何人都可以向我解释为什么我收到此错误?请解释一下正确的代码是什么。

2 个答案:

答案 0 :(得分:0)

您正在使用Pack p = new Pack("cards.txt"); p.cards[0].getName(); 注入内部使用角度的DI系统的服务。对于这个用例,它正在寻找角度的DI系统中的mockService,它并不存在。

inject()参数中删除mockService并从当前所在的inject()范围使用它,或者使用提供程序describe服务,以便在需要测试的内容时提供mockService。例如

$provide

More info

答案 1 :(得分:0)

这是因为你试图在mockService注射中注射beforeEach

  beforeEach(inject(function(
    $controller, 
    $rootScope, 
    $httpBackend, 
    $http, 
    $q, 
    mockService // REMOVE THIS!
  ) {
  // ....
  }));

  beforeEach(inject(function(
    $controller, 
    $rootScope, 
    $httpBackend, 
    $http, 
    $q
  ) {
  // ....
  }));