模拟后端 GET 请求未被服务方法捕获

mocked backend GET request not caught by service method

我正在构建控制器名称 GeneController 的测试,它使用名为 Gene 的服务来制作一堆 API 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'
          }
        }
      }
      }))

控制器:基因控制器

    .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

我遇到的问题是 "secondary" GET 请求是由 Gene.prototype.getUrl 方法促进的。我认为该方法本身运行良好,因为正确的内容(来自突变、频率和注释)显示在网页上。但是,这些 GET 请求失败了,我从 mocha 收到以下错误:"undefined is not an object (evaluating '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"

非常感谢对此问题的任何帮助。我完全坚持这一点。提前谢谢你:)

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