Jasmine Testing Controller 和 mock Service Promise 中返回的数据

Jasmine Testing Controller and mock returned data in Service Promise

我在模拟数据服务承诺时遇到问题。

我使用 AngularJS 和 Jasmine 2.2.0

我的密码是:

控制器

app.controller('homeController', ['$scope', 'ngAppSettings', 'homeViewModel', 'storageService', 'homeService',
function ($scope, ngAppSettings, homeViewModel, storageService, homeService) {

    $scope.applicationName = ngAppSettings.applicationName;

    $scope.model = homeViewModel;

    storageService.getStorageAuth().then(function (data) {

        $scope.model.userName= data.name;

    }, function (err) {
        alert(err.errors[0].message);
    });

}]);

服务

app.service('storageService', ['$q', 'ngAppSettings', 'localStorageService',
function ($q, ngAppSettings, localStorageService) {

    this.getStorageAuth = function () {

        var deferred = $q.defer();

            var userAuth = localStorageService.get(ngAppSettings.storageUser);
            if (userAuth) {
                data = userAuth;
            }

        deferred.resolve(data);

        return deferred.promise;
    };
}]);

测试规格

describe('Controllers: homeController', function () {
var $rootScope;
var $scope;
var ctrl;
var $q;
var deferred;
var storageService;

beforeEach(module('IspFrontEndTemplateApp'));

beforeEach(inject(function (_$q_, _storageService_) {
    $q = _$q_;
    storageService = _storageService_;

    deferred = $q.defer();

    spyOn(storageService, "getStorageAuth").and.returnValue(deferred.promise);
}));

beforeEach(inject(function (_$rootScope_, $controller) {
    $rootScope = _$rootScope_;
    $scope = $rootScope.$new();
    ctrl = $controller('homeController', { $scope: $scope });
}));

it('UserName is: UsuarioTeste', function () {

    deferred.resolve({
        isAuth: true,
        userName: "UsuarioTeste",
        name: "UsuarioTeste"
    });

    expect($scope.model.userName).toBe('UsuarioTeste');
});
});

错误是:预期''为'UsuarioTeste'。

我需要在控制器中测试我的模型属性,但值没有刷新

您需要在测试中再 $digest 一次:

$scope.$digest();
expect($scope.model.userName).toBe('UsuarioTeste'); // will work

原因是承诺是异步解决的,即承诺永远不会在创建它的同一 $apply 中调用其成功或错误回调,即使它已被解决。如果您在函数的开头创建一个承诺,并且已解决的承诺的效果在几行之后就已经可以观察到,那么代码可能很难阅读。