Проверка углового контроллера на scope.variable не определена

Я пытаюсь выучить угловой тест с помощью $resource.

Здесь у меня есть простой контроллер:

.controller('DictionaryCtrl', function ($scope, DictionaryService) {

  $scope.jSearchDictionary = function () {
    $scope.word = DictionaryService.getByJword({ jp: $scope.jword });
  }

  $scope.eSearchDictionary = function () {
    $scope.word = DictionaryService.getByEword({ eng: $scope.eword });
  }
})

На мой взгляд, у меня есть 2 ng-submit (jSearchDictionary и eSearchDictionary), и я связываю соответствующее слово, которое ищется ( jword или eword).

Сервис также довольно прост:

.factory('DictionaryService', function ($resource) {
  return $resource('http://127.0.0.1:3000/api/nlp/words', {}, {
    getByJword: { method: 'GET', params: { jp: '@jword' } },
    getByEword: { method: 'GET', params: { en: '@eword' } },
  })
})

Наконец, вот мой тест.

describe('Controller: nlpCtrl', function () {

beforeEach(function () {
  this.addMatchers({
    toEqualData: function (expected) {
      return angular.equals(this.actual, expected);
    }
  });
});

beforeEach(module('gakusei'));

describe('nlpCtrl', function () {
var scope,
    $controller,
    $httpBackend,
    $stateParams,
    Eword,
    mockWord = [
    {
      "words": [
          {
            "readings": [
                "ホッケー"
            ]
          }
      ],
      "count": 1
    }];

beforeEach(inject(function (_$httpBackend_, $rootScope, _$controller_) {
  scope = $rootScope.$new();
  $controller = _$controller_;
  $httpBackend = _$httpBackend_;
}));

afterEach(function () {
  $httpBackend.verifyNoOutstandingExpectation();
  $httpBackend.verifyNoOutstandingRequest();
});

it('should get a word', inject(function (DictionaryService) {
  Eword = "englishWord";
  $httpBackend.expectGET('http://127.0.0.1:3000/api/nlp/words?eng=englishWord')
    .respond(mockWord[0]);

  var ctrl = $controller('DictionaryCtrl', { $scope: scope });
  var request = DictionaryService.getByEword({ eng: Eword })

  $httpBackend.flush();

  expect(scope.word).toEqualData(mockWord[0]);
  expect(BasketService.getByJword).toBeTruthy();
  expect(BasketService.getByEword).toBeTruthy();
}));
});
});

Проблема на линии:

expect(scope.word).toEqualData(mockWord[0]);

scope.word не определено. Модульное тестирование сейчас у меня над головой, я совсем не уверен, что делаю. Если у вас есть решение этой конкретной проблемы, у вас есть какие-либо советы по поводу всего кода или вы хотите сообщить мне и немного помочь, это было бы здорово.

2 ответа

Решение

У вас есть пара проблем в вашем ожидании и настроены.

1) Вы тестируете контроллер и его область действия, поэтому выполняйте действия с методами контроллера и устанавливайте значения в области контроллера.

2) Вместо того, чтобы делать Eword = "englishWord"; Вы должны установить значение в области видимости контроллера scope.eword = "englishWord";

3) Вместо непосредственного вызова сервисного метода DictionaryService.getByEword({ eng: Eword }) необходимо вызвать метод в области видимости, т.е. scope.eSearchDictionary(); так что, когда метод разрешен, он разрешается с соответствующими данными и устанавливает его в области видимости.

4) Обратите внимание, что при тестировании scope.word непосредственно вы можете не получить желаемый результат, так как объект результата будет иметь дополнительные свойства, такие как $promise в теме. Так как вы непосредственно присваиваете результаты.

5) Я не уверен, что вам вообще нужны последние 2 ожидания.

Пытаться:-

it('should get a word', inject(function (DictionaryService) {
  scope.eword = "englishWord";
  $httpBackend.expectGET('http://127.0.0.1:3000/api/nlp/words?eng=englishWord')
    .respond(mockWord[0]);

  $controller('DictionaryCtrl', { $scope: scope });

  scope.eSearchDictionary();

  $httpBackend.flush();

  expect(scope.word.words[0]).toEqual(mockWord[0].words[0]);

  /*I dont think you need the following expectations at all*/
  expect(DictionaryService.getByJword).toBeDefined();
  expect(DictionaryService.getByEword).toBeDefined();

}));

Plnkr

Некоторый синтаксис метода утилит ожидания отличается от того, что вы используете, вы можете использовать тот же, который вы используете, я только что сделал это для демонстрации

Переменная, которую вы ищете, не существует вне этих двух функций. Попробуйте определить его в верхней части вашего контроллера следующим образом:

.controller('DictionaryCtrl', function ($scope, DictionaryService) {

  $scope.word = '';

  $scope.jSearchDictionary = function () {
    $scope.word = DictionaryService.getByJword({ jp: $scope.jword });
  }

  $scope.eSearchDictionary = function () {
    $scope.word = DictionaryService.getByEword({ eng: $scope.eword });
  }
})
Другие вопросы по тегам