2

サービスで http リクエストのキャンセルを実装しましたが、それをテストしたいと思います。

angular.module('EmsWeb.Services').factory('DalService', ['$q', '$http', 'AppModel', 'DalRequestCache', function ($q, $http, appModel, dalRequestCache) {
    return {
        apiUrl: '../api/ModuleApi/',
        viewUrl: '../',
        submitRequestPromise: function (senderIdentifier, url, requestData) {                       
            this.cancelRequest(senderIdentifier);
            var canceler = $q.defer();
            this.addToCache(senderIdentifier, canceler);
              return $http({
                  method: 'POST',
                  url: url,                
                  data: requestData?requestData:null,
                  timeout: canceler.promise
              });           
        },
        addToCache: function (senderIdentifier, canceler) {
            var request = { 'senderIdentifier': senderIdentifier, 'cancelPromise': canceler };
            dalRequestCache.put(senderIdentifier, request);
        },
        cancelRequest: function (senderIdentifier) {
            var request = dalRequestCache.get(senderIdentifier);
            if (request) {
                request.cancelPromise.resolve('canceled');
                dalRequestCache.remove(senderIdentifier);
                return true;
            }
            return false;
        },
 getModules: function (senderIdentifier, appContext, successFn, errorFn) {
            var url = this.apiUrl + 'GetModules';
            var ctx = appModel.context.toRequestContext(appContext);
            this.submitRequest(senderIdentifier, url, ctx, successFn, errorFn);
        }
};
}]);

これがテストです

describe("Unit: Testing Services", function() {

    beforeEach(angular.mock.module('EmsWeb.Services'));
    describe("Unit: DalService", function () {
        var $httpBackend, dalService, appModel;
        beforeEach(inject(function ($q, _$httpBackend_, AppModel, DalService) {
            dalService = DalService;
            appModel = AppModel;
            $httpBackend = _$httpBackend_;
            $httpBackend.when('POST', '../api/ModuleApi/GetModules').respond({ userId: 'userX', 'A-Token': 'xxx' });            
            appModel.context.company = { code: 'LPL' };

        }));

        describe("canceling requests", function () {            
            it('checks request should be canceled ', function () {

                var returnedData;
                var callBackFn = function (data) {
                    returnedData = data;
                };
                dalService.getModules('senderIdentifier', appModel.context, callBackFn, callBackFn);

                var canceled = dalService.cancelRequest('senderIdentifier');
                $httpBackend.flush();
                expect(canceled).to.be.true;
                expect(returnedData).to.undefined;
            });

        });

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

実行すると、「フラッシュする保留中の要求はありません」というエラーが表示されます。フラッシュを呼び出さない場合、そのリクエストが確実にキャンセルされることをテストするにはどうすればよいですか。

ありがとう、アレキサンダー

4

1 に答える 1

4

を呼び出す代わりに$httpBackend.flush()、を呼び出します$rootScope.$digest()。これにより、非同期アクション (Promise など) が強制的に呼び出され、リクエストがキャンセルされるため、フラッシュされる HTTP リクエストはありません。ここに示すコード例ではこれをテストしていませんが、私の場合はうまくいきました。

于 2014-04-01T13:45:06.667 に答える