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

时间:2017-02-28 18:57:59

标签: angularjs unit-testing mocha chai httpbackend

我正在构建一个控制器名称 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'
          }
        }
      }
      }))

控制器: 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.prototype.getUrl方法促进的“辅助”GET请求。我认为该方法本身工作正常,因为正确的内容(来自突变,频率和注释)显示在网页上。但是这些GET请求失败了,我从mocha得到以下错误:“undefined不是一个对象(评估'mutationData.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"

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

1 个答案:

答案 0 :(得分:0)

控制器以非Restful方式调用我们的Rest API。我已经将每个GET请求拆分为自己的代码块,使用restangular来实现promise:

.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'