2016-03-15 84 views
0

在我的角度應用程序,我有一個controller定義如下:

angular.module('myApp.controllers') 
    .controller('AppController', function($rootScope, $scope, CheckResource) { 
    $scope.check = function(data) { 
     var promise = CheckResource.query(data).$promise; 
     promise.then(function(result) { 
     $scope.value = result; 
     }, function() { 
     $scope.value = "default"; 
     }); 
    }; 
    }; 

而且我CheckResourceFactory如下:

angular.module('myApp.services', ['ngResource']) 
    .factory('CheckResource', function($resource) { 
    return $resource('/check', {}, { 
     query: { 
     method: 'POST' 
     } 
    }); 
    }); 

我想編寫一個單元測試我控制器AppController並以某種方式嘲笑我的工廠CheckResource,但我不知道我可以如何使用$q和推遲的承諾達到此目的。任何人都可以請解釋我在這種情況下發生了什麼?

測試此場景的選項有哪些?我應該嘲笑我的服務嗎?我應該使用spyOn嗎?我應該使用$httpBackend嗎?或者,我應該進行E2E測試嗎?

+0

,你必須注入$ httpBackend服務到您的測試文件 –

回答

-1

ngResource在單獨的模塊中定義。請檢查文檔http://docs.angularjs.org/api/ngResource在你必須包括並添加ngResource依賴於MyApp.Factory模塊換句話說 - angular.module(「MyApp.Factory」,[「ngResource」])

var factory; 

beforeEach(function() { 

    module("MyApp.Factory"); 

    inject(function (_factory_) { 
    factory = _factory_; 
    }); 

}); 
0

假設你有一個控制器在您的測試嘲笑,你可以這樣做:

var deferred; 

beforeEach(inject(function($q) { 
    deferred = $q.defer(); 

    myController.CheckResource = { 
     query: function() { 
      return {$promise: deferred.promise}; 
     } 
    }; 
})); 

然後在您的測試本身:

it('tests CheckResource', function() { 
    deferred.resolve([]); 
    expect(something).toHaveHappened(); 
}); 
相關問題