function module(sTitle, mHooks) {
		var fnAfter, fnAfterEach, fnBefore, fnBeforeEach;

		mHooks = mHooks || {};
		fnAfter = mHooks.after || function () {};
		fnAfterEach = mHooks.afterEach || function () {};
		fnBefore = mHooks.before || function () {};
		fnBeforeEach = mHooks.beforeEach || function () {};

		mHooks.after = function (assert) {
			if (window.blanket && !sFilter && !sTestId && !this.__ignoreIsolatedCoverage__
					&& iThreshold >= 100 && !assert.test.module.stats.bad) {
				checkIsolatedCoverage(this, assert);
			}

			return fnAfter.apply(this, arguments);
		};

		mHooks.afterEach = function (assert) {
			var fnCheckUncaught = checkUncaught.bind(null, assert.ok.bind(assert, false));

			function error(oError) {
				fnCheckUncaught();
				throw oError;
			}

			function success(vResult) {
				if (vResult && typeof vResult.then === "function") {
					return vResult.then(success, error);
				}
				fnCheckUncaught();
				return vResult;
			}

			try {
				return success(fnAfterEach.apply(this, arguments));
			} catch (oError) {
				error(oError);
			}
		};

		mHooks.before = function (assert) {
			var aHits;

			this.$currentFileName = jQuery.sap.getResourceName(assert.test.module.name);
			aHits = window.blanket && _$blanket[this.$currentFileName];
			if (aHits) {
				this.$oldHits = aHits.slice();
				if (aHits.branchTracking) {
					this.$oldBranchTracking = JSON.parse(
						JSON.stringify(aHits.branchTracking, ["falsy", "truthy"]));
				}
				aHits.warnings.forEach(function (sMessage) {
					assert.ok(false, sMessage);
				});
			}

			return fnBefore.apply(this, arguments);
		};

		mHooks.beforeEach = function (assert) {
			checkUncaught(); // cleans up what happened before
			return fnBeforeEach.apply(this, arguments);
		};

		fnModule(sTitle, mHooks);
	}
Wrapper for <code>QUnit.module</code> to check for uncaught errors in sync promises and
for 100% isolated test coverage.

@param {string} sTitle
  The module's title
@param {object} [mHooks]
  Optional map of hooks, e.g. "beforeEach"