function fake(f) {
			if (arguments.length > 0 && typeof f !== "function") {
				throw new TypeError("Expected f argument to be a Function");
			}

			return wrapFunc(f);
		}
Returns a `fake` that records all calls, arguments and return values.

When an `f` argument is supplied, this implementation will be used.

@example
// create an empty fake
var f1 = sinon.fake();

f1();

f1.calledOnce()
// true

@example
function greet(greeting) {
  console.log(`Hello ${greeting}`);
}

// create a fake with implementation
var f2 = sinon.fake(greet);

// Hello world
f2("world");

f2.calledWith("world");
// true

@param {Function|undefined} f
@returns {Function}
@namespace