在业力/茉莉花测试中模拟角度服务/承诺

 Wo-们是平行线 发布于 2023-01-12 10:50

我正在尝试编写业力/茉莉花测试,我想了解一些关于模拟如何处理正在返回承诺的服务的解释.我解释一下我的情况:

我有一个控制器,我在其中进行以下调用:

mapService.getMapByUuid(mapUUID, isEditor).then(function(datas){
    fillMapDatas(datas);
});

function fillMapDatas(datas){
    if($scope.elements === undefined){
        $scope.elements = [];
    }
 //Here while debugging my unit test, 'datas' contain the promise javascript object instead //of my real reponse.
   debugger;
    var allOfThem = _.union($scope.elements, datas.elements);

    ...

以下是我的服务方式:

(function () {
'use strict';

var serviceId = 'mapService';

angular.module('onmap.map-module.services').factory(serviceId, [
    '$resource',
    'appContext',
    'restHello',
    'restMap',
    serviceFunc]);

function serviceFunc($resource, appContext, restHello, restMap) {

    var Maps = $resource(appContext+restMap, {uuid: '@uuid', editor: '@editor'});

    return{          
        getMapByUuid: function (uuid, modeEditor) {
            var maps = Maps.get({'uuid' : uuid, 'editor': modeEditor});
            return maps.$promise;
        }
    };
}

})();

最后,这是我的单元测试:

describe('Map controller', function() {
var $scope, $rootScope, $httpBackend, $timeout, createController, MapService, $resource;

beforeEach(module('onmapApp'));

beforeEach(inject(function($injector) {
    $httpBackend = $injector.get('$httpBackend');
    $rootScope = $injector.get('$rootScope');
    $scope = $rootScope.$new();

    var $controller = $injector.get('$controller');

    createController = function() {
        return $controller('maps.ctrl', {
            '$scope': $scope
        });
    };
}));

afterEach(function() {
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});

var response = {"elements":[1,2,3]};

it('should allow user to get a map', function() {

    var controller = createController();
    $httpBackend.expect('GET', '/onmap/rest/map/MY-UUID?editor=true')
        .respond({
            "success": response
        });


// hope to call /onmap/rest/map/MY-UUID?editor=true url and hope to have response as the fillMapDatas parameter
    $scope.getMapByUUID('MY-UUID', true); 

    $httpBackend.flush();
});
});

我真正想做的是让我的响应对象({"elements:...})作为fillMapDatas函数的datas参数.我不明白如何模拟所有服务事物(服务,承诺,然后)

1 个回答
  • 所以,如果您的服务响应符合预期,您想要测试吗?然后,这是你宁愿在服务上测试的东西.基于单元测试承诺的方法可能如下所示:

    var mapService, $httpBackend, $q, $rootScope;
    
    beforeEach(inject(function (_mapService_, _$httpBackend_, _$q_, _$rootScope_) {
      mapService = mapService;
      $httpBackend = _$httpBackend_;
      $q = _$q_;
      $rootScope = _$rootScope_;
    
      // expect the actual request
      $httpBackend.expect('GET', '/onmap/rest/map/uuid?editor=true');
    
      // react on that request
      $httpBackend.whenGET('/onmap/rest/map/uuid?editor=true').respond({
        success: {
          elements: [1, 2, 3]
        }
      });
    }));
    

    如您所见,您不需要使用$injector,因为您可以直接注入所需的服务.如果你想在整个测试中使用正确的服务名称,你可以用前缀和后缀"_"注入它们,inject()足够聪明,可以识别你的意思.我们还$httpBackend为每个it()规范设置了模拟.我们设置$q$rootScope供以后处理.

    以下是测试服务方法返回承诺的方法:

    it('should return a promise', function () {
      expect(mapService.getMapUuid('uuid', true).then).toBeDefined();
    });
    

    由于promise总是有一个.then()方法,我们可以检查这个属性,看看它是否是一个promise(当然,其他对象也可以有这个方法).

    接下来,您可以测试您使用适当值解析的承诺.您可以设置deferred明确解决的问题.

    it('should resolve with [something]', function () {
      var data;
    
      // set up a deferred
      var deferred = $q.defer();
      // get promise reference
      var promise = deferred.promise;
    
      // set up promise resolve callback
      promise.then(function (response) {
        data = response.success;
      });
    
      mapService.getMapUuid('uuid', true).then(function(response) {
        // resolve our deferred with the response when it returns
        deferred.resolve(response);
      });
    
      // force `$digest` to resolve/reject deferreds
      $rootScope.$digest();
    
      // make your actual test
      expect(data).toEqual([something]);
    });
    

    希望这可以帮助!

    2023-01-12 10:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有