Я пытаюсь выполнить модульное тестирование функции в своем контроллере, но не могу получить переменную $scope
для проверки. Я устанавливаю переменную в .then()
моего контроллера и хочу выполнить модульное тестирование, чтобы убедиться, что она установлена правильно, когда она попадает в блок .then.
Мой код тестового контроллера:
function submit() {
myService.submit().then(function(responseData){
if(!responseData.errors) {
$scope.complete = true;
$scope.details = [
{
value: $scope.formattedCurrentDate
},
{
value: "$" + $scope.premium.toFixed(2)
},
];
} else {
$scope.submitError = true;
}
});
}
Куда идет этот сервисный вызов, не имеет значения. Он вернет JSON с action: 'submitted', 'response' : 'some response'
. .then() проверяет, присутствуют ли ошибки в responseData, и если нет, он должен установить некоторые детали. Эти $scope.details — это то, что я пытаюсь проверить в своем модульном тесте ниже:
it('should handle submit details', function () {
var result;
var premium = 123.45;
var formattedCurrentDate = "2016-01-04";
var promise = myService.submit();
mockResponse = {
action: 'submitted',
response: 'some response'
};
var mockDetails = [
{
value: formattedCurrentDate
},
{
value: "$"+ premium.toFixed(2)
}
];
//Resolve the promise and store results
promise.then(function(res) {
result = res;
});
//Apply scope changes
$scope.$apply();
expect(mockDetails).toEqual(submitController.details);
});
Я получаю сообщение об ошибке, что $scope.details не определено. Я не уверен, как заставить тест распознавать изменение этих данных $scope в контроллере.
Перед каждой и другими функциями в моем модульном тесте:
function mockPromise() {
return {
then: function(callback) {
if (callback) {
callback(mockResponse);
}
}
}
}
beforeEach(function() {
mockResponse = {};
module('myApp');
module(function($provide) {
$provide.service('myService', function() {
this.submit = jasmine.createSpy('submit').and.callFake(mockPromise);
});
});
inject(function($injector) {
$q = $injector.get('$q');
$controller = $injector.get('$controller');
$scope = $injector.get('$rootScope');
myService = $injector.get('myService');
submitController = $controller('myController', { $scope: $scope, $q : $q, myService: myService});
});
});
Как мне разрешить обещание в моем модульном тесте, чтобы я мог использовать $scope.$digest() и видеть изменение переменной $scope?