function deepContains(assert, oValue, oExpected, sMessage) {
		for (var sKey in oExpected) {

			if (!(sKey in oValue)) {
				assert.ok(false, "Expected property " + sMessage + "/" + sKey + " does not exist");
				continue;
			}

			if (Array.isArray(oExpected[sKey]) === Array.isArray(oValue[sKey])) {
				assert.equal(typeof oValue[sKey], typeof oExpected[sKey], sMessage + "/" + sKey + " have same type");
			} else {
				assert.ok(false, sMessage + "/" + sKey + " - one is an array, the other is not");
			}


			if (Array.isArray(oExpected[sKey]) && Array.isArray(oValue[sKey])) {
				assert.equal(oValue[sKey].length, oExpected[sKey].length, sMessage + "/" + sKey + " length matches (" + oExpected[sKey].length + ")");
			}

			if (oExpected[sKey] !== null && oExpected[sKey] !== undefined && typeof oExpected[sKey] === "object" && typeof oValue[sKey] === "object") {
				// Go deeper
				if (oValue[sKey] === null) {
					assert.ok(false, "Property " + sMessage + "/" + sKey + " is null");
				} else {
					deepContains(assert, oValue[sKey], oExpected[sKey], sMessage + "/" + sKey);
				}
			} else {
				// Compare directly
				assert.equal(oValue[sKey], oExpected[sKey], sMessage + "/" + sKey + " match (" + oExpected[sKey] + ")");
			}
		}
	}
Test-Function to be used in place of deepEquals which only tests for the existence of the given
values, not the absence of others.

@param {object} assert - The QUnit assert object
@param {object} oValue - The value to be tested
@param {object} oExpected - The value that is tested against, containing the structure expected inside oValue
@param {string} sMessage - Message prefix for every sub-test. The property names of the structure will be prepended to this string