Jasmine Testing Controller和mock在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

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

最新更新