嘲笑的后端GET请求未被服务方法捕获

嘲笑的后端GET请求未被服务方法捕获

问题描述:

我正在为控制器名称构建测试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" 

这个问题的任何帮助将是非常赞赏。我完全陷入了这个问题。预先感谢您:)

控制器正以非稳定的方式调用我们的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'