2017-02-28 58 views
1

我正在爲控制器名稱構建測試GeneController使用名爲基因的服務進行一堆API GET請求。我嘲笑這樣的主要GET請求,我敢肯定它的正常工作:嘲笑的後端GET請求未被服務方法捕獲

$httpBackend.expectGET '/api/knowledge/genes/param1' 
     .respond(200, JSON.stringify({ 
     data: { 
     mutationsUrl: 'http://localhost:3000/api/knowledge/genes/param1/mutations', 
     frequenciesUrl: 'http://localhost:3000/api/knowledge/genes/param1/frequencies', 
     annotationUrl: 'http://localhost:3000/api/knowledge/genes/param1/annotation', 
     sections: { 
     description: { 
      data: 'holder' 
      } 
     } 
     } 
     })) 

控制器: GeneController

.controller 'GeneController', Array '$scope', '$routeParams', '$http', 'Gene', ($scope, $routeParams, $http, Gene) -> 

    $scope.entity = Gene.get($routeParams 
     (entity) -> 
     $scope.description = entity.data.sections.description.data 

     entity.getUrl entity.data.mutationsUrl, {limit: 10}, (err, mutationsData) -> 
      if ! err? 
      for m in mutationsData.data 
       m.selected = true 
      $scope.mutations = mutationsData 

     entity.getUrl entity.data.frequenciesUrl, {}, (err, frequenciesData) -> 
      if ! err? 
      $scope.frequencies = frequenciesData 

     entity.getUrl entity.data.annotationUrl, {}, (err, annotationData) -> 
      if ! err? 
      $scope.annotation = annotationData 

     (error) -> 
     console.log error 
    ) 

服務:基因

.factory 'Gene', Array '$resource', '$http', ($resource, $http) -> 
     Gene = $resource '/api/knowledge/genes/:gene', {}, 
     query: 
      method: 'GET' 

     Gene.prototype.getUrl = (url, options, callback) -> 
     $http {method: 'GET', url: url, params: options} 
      .then (res) -> # Success callback 
      callback null, res.data 
      ,(res) -> # Error callback 
      callback res.status, res.data 

     Gene 

我遇到的問題是由Gene.pr促進的「輔助」GET請求ototype.getUrl方法。我認爲該方法本身工作正常,因爲正確的內容(來自突變,頻率和註釋)正顯示在網頁上。然而,這些GET請求失敗,我從摩卡得到以下錯誤:「未定義不是一個對象(評估'mutationsData.data')」。

我嘲笑這些GET請求的反應無濟於事。這是我對控制器的測試。

測試

... 

describe 'GeneController',() -> 

    Gene = undefined 

    beforeEach inject (_$controller_, $rootScope, _Gene_, _$httpBackend_) -> 
     scope = $rootScope.$new() 
     controller = _$controller_ 'GeneController', { 
     $scope: scope 
     $routeParams: { gene: 'param1' } 
     } 
     Gene: _Gene_ 
     $httpBackend = _$httpBackend_ 

    describe 'valid response',() -> 

     beforeEach() -> 
     $httpBackend.whenGET 'http://localhost:3000/api/knowledge/genes/param1/mutations' 
      .respond(200, JSON.stringify({ 
      data: "something" 
      })) 

     $httpBackend.whenGET 'http://localhost:3000/api/knowledge/genes/param1/frequencies' 
      .respond(200, JSON.stringify({ 
      data: 'somethingelse' 
     })) 

     $httpBackend.whenGET 'http://localhost:3000/api/kowledge/gene/param1/annotation' 
      .respond(200, JSON.stringify({ 
      data: 'somethingelser' 
     })) 

     $httpBackend.expectGET '/api/knowledge/genes/param1' 
      .respond(200, JSON.stringify({ 
      data: { 
      mutationsUrl: 'http://localhost:3000/api/knowledge/genes/param1/mutations', 
      frequenciesUrl: 'http://localhost:3000/api/knowledge/genes/param1/frequencies', 
      annotationUrl: 'http://localhost:3000/api/knowledge/genes/param1/annotation', 
      sections: { 
       description: { 
       data: 'holder' 
       } 
      } 
      } 
     })) 

     $httpBackend.flush() 

     it "should set $scope.description when the Gene is called",() -> 
     expect(scope.description).to.equal "holder" 

這個問題的任何幫助將是非常讚賞。我完全陷入了這個問題。預先感謝您:)

回答

0

控制器正以非穩定的方式調用我們的Rest API。我已經將每個GET請求分成它自己的代碼塊,使用restangular實現承諾:

.controller 'GeneController', Array '$scope', '$routeParams', 'Gene', 'Restangular', ($scope, $routeParams, Gene, Restangular) -> 

    _genes_ = Restangular.all('knowledge').all('genes') 

    _genes_.get($routeParams.gene).then (results) -> 
     $scope.entity = results.data 
     $scope.description = $scope.entity.data.sections.description.data 
    .catch (error) -> 
     console.log 'Unable to load genes data' 

    _genes_.all($routeParams.gene).get('mutations').then (results) -> 
     for m in results.data.data 
     m.selected = true 
     $scope.mutations = results.data 
    .catch (error) -> 
     console.log 'Unable to load mutations data' 

    _genes_.all($routeParams.gene).get('frequencies').then (results) -> 
     $scope.frequencies = results.data 
    .catch (error) -> 
     console.log 'Unable to load frequencies data' 

    _genes_.all($routeParams.gene).get('annotation').then (results) -> 
     $scope.annotation = results.data 
    .catch (error) -> 
     console.log 'Unable to load annotation data'