Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法测试控制器的服务调用_Javascript_Angularjs_Karma Jasmine - Fatal编程技术网

Javascript 无法测试控制器的服务调用

Javascript 无法测试控制器的服务调用,javascript,angularjs,karma-jasmine,Javascript,Angularjs,Karma Jasmine,我正试图编写一个代码来测试在我的控制器中完成的服务调用。我试图在控制器中对特定功能进行单元测试,该功能正在执行服务调用并带来数据。目前我正在尝试使用本地json,但它实际上会执行一个服务调用 我知道,首先我创建了一个spy对象,但是我得到的错误是“TypeError:jasmine.CreateSpyObj不是一个函数”,我对单元测试是新手。我无法创建间谍对象,因此无法继续。正在粘贴我的代码,请您帮助我 此外,我不确定一旦我成功创建了spyObject,我到底要做什么,我实际上想测试我的服务是否

我正试图编写一个代码来测试在我的控制器中完成的服务调用。我试图在控制器中对特定功能进行单元测试,该功能正在执行服务调用并带来数据。目前我正在尝试使用本地json,但它实际上会执行一个服务调用

我知道,首先我创建了一个spy对象,但是我得到的错误是“TypeError:jasmine.CreateSpyObj不是一个函数”,我对单元测试是新手。我无法创建间谍对象,因此无法继续。正在粘贴我的代码,请您帮助我

此外,我不确定一旦我成功创建了spyObject,我到底要做什么,我实际上想测试我的服务是否受到了良好的攻击,我是否得到了服务的响应

请帮帮我,我从很多天以来一直在努力

服务代码:

//app is the module name
app.factory('appServices', ['$rootScope', '$http', function($rootScope, 
$http) {
var appServices = {};
appServices.getData = function(){
      return $http.get(scripts/services/data/unitTesting.json'); 
 };
unitTesting.json代码:

{
"name":"unit testing",
"countryCode": "EG",
"countryName": "Egypt",
"region": "Africa"
}
控制器代码:

getData: function(){
        appServices.getData().then(function(response) {
            if (response && response.data) {
                $scope.testVariable= response.data.name;
            }
        });
    },
单元测试代码:

  describe('myCtrl', function() {
      beforeEach(module('app'));

      var $controller;

      beforeEach(inject(function(_$controller_){
         $controller = _$controller_;
  }));

 describe('service call test', function() {
 var $http,$httpBackend,appServices,
 myService,$q,$rootScope,controller;

 var mockItem = 
       {
       "name":"unit testing",
       "countryCode": "EG",
       "countryName": "Egypt",
       "region": "Africa"
       }
 beforeEach(inject(function(_$http_,_$httpBackend_,appServices,_$q_, 
 _$rootScope_) {
   $http = _$http_;
   $httpBackend = _$httpBackend_; 
   appServices = appServices; 
   $rootScope = _$rootScope_;
   $q =_$q_;
   jasmine.spyOn(appServices, 'getData').and.returnValue($q.when(mockItem));
   controller = $controller('myCtrl', { $scope: $scope });
 }));
  it('Service call test ', function() {
  controller = $controller('myCtrl', { $scope: $rootScope.new() });
  controller.getData();
  expect(appServices.getData).toHaveBeenCalled();
 }); 
 });
 });
错误:

 TypeError: jasmine.spyOn is not a function

使用
spyOn
功能:

jasmine.spyOn(appServices, 'getData');
然后,您可以在测试中检查调用,如:

expect(appServices.getData).toHaveBeenCalled();
看看您是如何编写规范的,我可以建议一些其他更改以帮助您运行规范:

var $rootScope,
    controller,
    $q;

beforeEach(inject(function(_$http_,_$httpBackend_,appServices,_$q_, _$rootScope_){
     $http = _$http_;
     $httpBackend = _$httpBackend_; 
     appServices= appServices;
     $rootScope = _$rootScope_;
     $q = _$q_;
     jasmine.spyOn(appServices, 'getData').and.returnValue($q.when(mockItem));
     controller = $controller('myCtrl', { $scope: $scope });
}));
describe('when fetching data in the controller', function(){
    it('should delegate the call to appServices.getData()', function() {
        controller = $controller('myCtrl', { $scope: $rootScope.new() });
        controller.getData();
        expect(appServices.getData).toHaveBeenCalled();
    }); 
});

它应该是小写:
jasmine.createSpyObj
非常感谢您的帮助,这是我的错误。你能告诉我测试我的服务呼叫成功与否的进一步步骤吗。我在网上看到了许多解决方案,我发现它们令人困惑。如果你能进一步帮助,那就太好了。你用的是哪个版本的茉莉花?@DarrenSweeney-its-jasmin-2.8。0@VitaliyGorbenko,我已经编辑了我的单元测试代码,并相应地编辑了我的问题,但我仍然得到了错误。请看一看我的代码,编辑了原始问题并显示错误消息。是否有任何方法与您单独连接。我觉得我的代码中缺少了一些重要的东西。