SAPUI5 Mockserver всегда генерирует одинаковые случайные идентификаторы - PullRequest
0 голосов
/ 10 марта 2020

У меня есть приложение UI5, которое я запускаю на стандартном встроенном фиктивном сервере для тестирования UI5.

Вот код из mockserver. js, генерируемый Web IDE автоматически:

sap.ui.define([
"sap/ui/core/util/MockServer",
"sap/ui/model/json/JSONModel",
"sap/base/util/UriParameters",
"sap/base/Log"
], function (MockServer, JSONModel, UriParameters, Log) {
"use strict";

var oMockServer,
    _sAppPath = "de/cimt/test/",
    _sJsonFilesPath = _sAppPath + "localService/mockdata";

var oMockServerInterface = {

    /**
     * Initializes the mock server asynchronously.
     * You can configure the delay with the URL parameter "serverDelay".
     * The local mock data in this folder is returned instead of the real data for testing.
     * @protected
     * @param {object} [oOptionsParameter] init parameters for the mockserver
     * @returns{Promise} a promise that is resolved when the mock server has been started
     */
    init : function (oOptionsParameter) {
        var oOptions = oOptionsParameter || {};

        return new Promise(function(fnResolve, fnReject) {
            var sManifestUrl = sap.ui.require.toUrl(_sAppPath + "manifest.json"),
                oManifestModel = new JSONModel(sManifestUrl);

            oManifestModel.attachRequestCompleted(function ()  {
                var oUriParameters = new UriParameters(window.location.href),
                    // parse manifest for local metatadata URI
                    sJsonFilesUrl = sap.ui.require.toUrl(_sJsonFilesPath),
                    oMainDataSource = oManifestModel.getProperty("/sap.app/dataSources/mainService"),
                    sMetadataUrl = sap.ui.require.toUrl(_sAppPath + oMainDataSource.settings.localUri),
                    // ensure there is a trailing slash
                    sMockServerUrl = /.*\/$/.test(oMainDataSource.uri) ? oMainDataSource.uri : oMainDataSource.uri + "/";
                    // ensure the URL to be relative to the application
                    sMockServerUrl = sMockServerUrl && new URI(sMockServerUrl).absoluteTo(sap.ui.require.toUrl(_sAppPath)).toString();

                // create a mock server instance or stop the existing one to reinitialize
                if (!oMockServer) {
                    oMockServer = new MockServer({
                        rootUri: sMockServerUrl
                    });
                } else {
                    oMockServer.stop();
                }

                // configure mock server with the given options or a default delay of 0.5s
                MockServer.config({
                    autoRespond : true,
                    autoRespondAfter : (oOptions.delay || oUriParameters.get("serverDelay") || 500)
                });

                // simulate all requests using mock data
                oMockServer.simulate(sMetadataUrl, {
                    sMockdataBaseUrl : sJsonFilesUrl,
                    bGenerateMissingMockData : true
                });

                var aRequests = oMockServer.getRequests();

                // compose an error response for each request
                var fnResponse = function (iErrCode, sMessage, aRequest) {
                    aRequest.response = function(oXhr){
                        oXhr.respond(iErrCode, {"Content-Type": "text/plain;charset=utf-8"}, sMessage);
                    };
                };

                // simulate metadata errors
                if (oOptions.metadataError || oUriParameters.get("metadataError")) {
                    aRequests.forEach(function (aEntry) {
                        if (aEntry.path.toString().indexOf("$metadata") > -1) {
                            fnResponse(500, "metadata Error", aEntry);
                        }
                    });
                }

                // simulate request errors
                var sErrorParam = oOptions.errorType || oUriParameters.get("errorType"),
                    iErrorCode = sErrorParam === "badRequest" ? 400 : 500;
                if (sErrorParam) {
                    aRequests.forEach(function (aEntry) {
                        fnResponse(iErrorCode, sErrorParam, aEntry);
                    });
                }

                // custom mock behaviour may be added here

                // set requests and start the server
                oMockServer.setRequests(aRequests);
                oMockServer.start();

                Log.info("Running the app with mock data");
                fnResolve();
            });

            oManifestModel.attachRequestFailed(function () {
                var sError = "Failed to load application manifest";

                Log.error(sError);
                fnReject(new Error(sError));
            });
        });
    },

    /**
     * @public returns the mockserver of the app, should be used in integration tests
     * @returns {sap.ui.core.util.MockServer} the mockserver instance
     */
    getMockServer : function () {
        return oMockServer;
    }
};

return oMockServerInterface;
});

Все наборы в моих метаданных oData имеют ID типа integer! (Автоинкремент на реальном сервере шлюза)

Самое смешное, что когда я создаю новый объект набора, он назначит 9 в качестве идентификатора этого объекта, который был создан впервые, и второй созданный объект будет 416 и т. д.

Ясно, что встроенный фиктивный сервер использует алгоритм случайной генерации без или с начальным числом c. Это причина того, что он будет генерировать все время одну и ту же цепочку идентификаторов для каждого набора в моей модели метаданных.

Теперь мой вопрос: как я могу изменить это поведение макетного сервера UI5?

Другими словами, как я могу установить случайное число в качестве начального числа для макетного сервера или как можно Я заставляю его использовать пошаговое поведение для идентификаторов.

Проблема поведения по умолчанию UI5, который генерирует 9, 416, 6671, 2631, ... в качестве идентификаторов, заключается в том, когда один из наборов уже имеет элемент с идентификатором 9 ! Затем, создав новый элемент, в моем списке будет два элемента с одинаковыми идентификаторами (т. Е. 9)!

1 Ответ

0 голосов
/ 11 марта 2020

Глядя на исходный код макета сервера UI5, похоже, что не существует общедоступного c установщика для случайного начального числа.

Если вы хотите смоделировать генерация последовательных идентификаторов, вы можете использовать MockServer # attachAfter () , чтобы изменить сгенерированное значение после того, как фиктивный сервер завершил обработку запроса, например:

oMockServer.attachAfter("POST", oEvent => {
    oEvent.getParameter("oEntity").Id = generateId()
}, "<your entity set name>")

Если вам нужно полное управляя тем, как фиктивный сервер отвечает на запрос, вы также можете переопределить его поведение для каждого запроса .

...