Поддельный бэкэнд GET-запрос не перехвачен сервисным методом

Я создаю тест для контроллера с именем 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

У меня проблема со "вторичными" GET-запросами, которые выполняются методом Gene.prototype.getUrl. Я думаю, что сам метод работает нормально, потому что на веб-странице отображается соответствующий контент (от мутаций, частот и аннотаций). Однако эти запросы GET не выполняются, и я получаю следующую ошибку от mocha: "undefined не является объектом (оценивает '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"

Любая помощь с этой проблемой будет очень цениться. Я довольно сильно застрял на этом. Заранее спасибо:)

1 ответ

Решение

Контроллер совершал вызовы нашего 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'
Другие вопросы по тегам