Изменение переменной AngularJS $scope в модульном тестировании .then()

Я пытаюсь выполнить модульное тестирование функции в своем контроллере, но не могу получить переменную $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?


person Exziled    schedule 11.01.2016    source источник
comment
Та же проблема, сводишь меня с ума.   -  person Dirigible    schedule 17.11.2017


Ответы (1)


Вам следует посмотреть, как тестировать промисы с помощью жасмина http://ng-learn.org/2014/08/Testing_Promises_with_Jasmine_Provide_Spy/

использование callFake сделает то, что вы пытаетесь высмеять

spyOn(myService, 'submit').and.callFake(function() {
  return {
    then: function(callback) { return callback(yourMock); }
  };
});
person Chris    schedule 06.12.2016