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