Проверка углового контроллера на 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();
}));
Некоторый синтаксис метода утилит ожидания отличается от того, что вы используете, вы можете использовать тот же, который вы используете, я только что сделал это для демонстрации
Переменная, которую вы ищете, не существует вне этих двух функций. Попробуйте определить его в верхней части вашего контроллера следующим образом:
.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 });
}
})