function checkBatch(aRequests, sGroupId) {
				/*
				 * Processes a request or a change set within a batch/change set.
				 * @param {number} iChangeSetNo Number of the change set in the current batch
				 *   starting with 1; a value of 0 indicates that the request is not part of a
				 *   change set
				 * @param {object} oRequest The request
				 * @param {number} i The request's position in the batch/change set
				 * @returns {Promise} A promise resolving with an object suitable for visit of
				 *   _Requestor#submitBatch
				 */
				function processRequest(iChangeSetNo, oRequest, i) {
					if (Array.isArray(oRequest)) {
						return processRequests(oRequest, i + 1);
					}
					if (iChangeSetNo > 0) {
						oRequest.$ContentID = i + "." + (iChangeSetNo - 1);
					}
					return checkRequest(oRequest.method, oRequest.url, oRequest.headers,
						oRequest.body, undefined, sGroupId, that.iBatchNo, iChangeSetNo || i + 1,
						oRequest.$ContentID
					).catch(function (oError) {
						if (oError.$insideBatch) {
							// convert the error back to a response
							return {
								headers : Object.assign({"Content-Type" : "application/json"},
									oError.headers),
								status : oError.status,
								body : {error : oError.error}
							};
						}
						oError.resourcePath = undefined;
						throw oError; // let the $batch itself fail
					}).then(function (oResponse) {
						var mHeaders = oResponse.messages
								? Object.assign({}, oResponse.headers,
									{"sap-messages" : oResponse.messages})
								: oResponse.headers;

						return {
							headers : mHeaders,
							status : oResponse.status || 200,
							responseText : typeof oResponse.body === "object"
								? JSON.stringify(oResponse.body) // content type "application/json"
								: oResponse.body // keep string for "text/plain"
						};
					});
				}

				/*
				 * @param {object[]} aRequests The array of requests in a $batch or in a change set
				 * @param {number} iChangeSetNo Number of the change set in the current batch
				 *   starting with 1; a value of 0 indicates that the request is not part of a
				 *   change set
				 * @returns {Promise} A promise on the array of batch responses
				 */
				function processRequests(aRequests0, iChangeSetNo) {
					return Promise.all(
						aRequests0.map(processRequest.bind(null, iChangeSetNo))
					).then(function (aResponses) {
						var iErrorIndex = aResponses.findIndex(function (oResponse) {
								return oResponse.status >= 300;
							});

						if (iErrorIndex >= 0) {
							return iChangeSetNo
								? aResponses[iErrorIndex] // only one error for the whole change set
								: aResponses.slice(0, iErrorIndex + 1);
						}
						return aResponses;
					});
				}

				that.iBatchNo += 1;

				return processRequests(aRequests, 0);
			}
Creates the view and attaches it to the model. Checks that the expected requests (see
{@link #expectRequest} are fired and the controls got the expected changes (see
{@link #expectChange}).

The given XML is embedded into a sap.ui.core.mvc.View with sap.m as the default namespace
and aliases "mvc" for sap.ui.core.mvc and "t" for sap.ui.table. Both sap.m.Table and
sap.ui.table.Table can (and should) be simplified. Simply add the dependent controls as
direct children of the table. The function takes care to properly embed them into columns
(one column per control).

@param {object} assert The QUnit assert object
@param {string} [sViewXML=""] The view content as XML
@param {sap.ui.model.odata.v4.ODataModel} [oModel] The model; it is attached to the view
  and to the test instance.
  If no model is given, <code>createTeaBusiModel</code> is used - unless
  <code>null</code> is explicitly given.
@param {object} [oController]
  An object defining the methods and properties of the controller
@param {object} [mPreprocessors] A map from the specified preprocessor type (e.g. "xml")
   to a preprocessor configuration, see {@link sap.ui.core.mvc.View.create}
@returns {Promise} A promise that is resolved when the view is created and all expected
  values for controls have been set