0

我在控制器中调用服务的功能。下面是代码测试。控制器茉莉花服务的成功和错误

服务

(function() { 
'use strict'; 
angular.module('MyApp') 
    .service('MyService', ['$http', function ($http) {             
     return { 
      getMyData: function (extension) {           
       return $http.get('www.something.com'); 
      }     
     }; 
    }]) 
})(); 

控制器

var getMyData = function() { 
      MyService.getMyData(extension).success(function (results) { 
       //Some functionality here 
      }) 
       .error(function (err, status) { 
       //Some functionality here 
      }); 
     } 
$scope.Call=function(){ 
    getMyData(); 
} 
$scope.Call(); 

现在请告诉我如何嘲笑服务调用(可能是供应商)。如何用完整的代码覆盖测试上述功能。

我的spec文件:

$provide.service("MyService", function() { 
      this.getMyData= function() { 
       var result = { 
        success: function (callback) { 
         return callback({ ServerFileName: "myserverfilename"}); 
        }, 
        error: function (callback) { 
         return callback({ ServerFileName: "myserverfilename" }); 
        } 
       }; 
       return result; 
}   

//...... 
my controller initiation and other code 

此代码不能覆盖的错误块,并给予错误

Cannot read property 'error' of undefined 

请帮助我如何写/嘲笑我的服务的getMyData功能我的规格文件

在此先感谢。

回答

0

您需要使用spyon,它会为您的服务创建某种模拟。您需要在测试文件中执行此操作。请检查下面的代码:

spyOn(MyService, "getMyData").and.callFake(() => { 
      return { 
       error: (callback) => { 
        return callback({}); 
       } 
      }; 
     }); 

希望我回答你的问题

+0

我应该在提供程序或规范(it)内写入此代码的位置? – aditya

+0

你必须在之前写这个。是这样的:。 beforeEach(angular.mock.inject((为MyService)=> { 变种_myService =为MyService; spyOn(_myService “getMyData”)and.callFake(()=> { 返回{ 错误:(回调)=> { 返回回调({});} }; });} –

+0

当我为此在beforeEach它显示错误“MyService.getMyData(...)。成功不是一项功能“ – aditya

1

由于.success.error是老已替换为.then(successCallback, errorCallback),你应该考虑用一个调用代替你的链接.success.error电话带有两个回调的.then方法作为它的参数:第一个是成功回调,第二个是错误回调。

如果这就是你愿意做,这是你的工作示例:

模块,服务和控制器

angular.module('MyApp', []); 

angular.module('MyApp') 
.service('MyService', ['$http', function ($http) {             
    return { 
     getMyData: function (extension) {           
      return $http.get('www.something.com'); 
     }     
    }; 
}]); 

angular.module('MyApp') 
.controller('MyAppController', ['$scope', function($scope){ 
    var extension = { foo: 'bar' }; 
    var getMyData = function() { 
     MyService.getMyData(extension).then(function (results) { 
      //Some functionality here 
     }, function (err, status) { 
      //Some functionality here 
     }); 
    } 
    $scope.Call=function(){ 
     getMyData(); 
    } 
    $scope.Call(); 
}]); 

而且你测试

describe('Controller: MyAppController', function(){ 
    beforeEach(module('MyApp')); 
    var flag, extension; 
    extension = { foo: "bar" }; 
    beforeEach(inject(function($controller, $rootScope, _MyService_) { 
     $scope = $rootScope.$new(); 
     MyService = _MyService_; 
     spyOn(MyService, 'getMyData').and.callFake(function(){ 
      return{ 
       then: function(successCallback, errorCallback){ 
        if(flag) successCallback(); 
        else errorCallback(); 
       } 
      } 
     }); 
     MyAppController = $controller('MyAppController', { 
      $scope: $scope, 
      MyService: MyService 
     }); 
    })); 

    describe('function: Call', function() { 
     //Text for Success Callback 
     it('should implicitly call MyService.getMyData with an extension object', function() { 
      flag = true; 
      $scope.Call(); 
      expect(MyService.getMyData).toHaveBeenCalledWith(extension); 
     }); 
     //Text for Error Callback 
     it('should implicitly call MyService.getMyData with an extension object', function() { 
      flag = false; 
      $scope.Call(); 
      expect(MyService.getMyData).toHaveBeenCalledWith(extension); 
     }); 
    }); 
}); 

更新: 我试过做这样的工作,但没有运气。由于.error()的呼叫被连接到.success()的呼叫,并且这种情况只有在呼叫.success()后才会被呼叫,它将永远不会呼叫.error()的呼叫,我们将无法模拟.error()。因此,如果我们试图这样做,我们总是得到这样的错误:

Cannot read property 'error' of undefined

因此,无论您可以使用注释/*istanbul ignore next*/在覆盖跳过这一部分,或者切换到.then()

希望这会有所帮助。

+0

感谢你的解决方案。你的意思是没有办法测试成功和错误块没有改变他们呢?我知道如何使用那么写。但是现在我们无法更改我们的源代码。任何其他方式? – aditya