UNPKG

@ngneat/spectator

Version:

A powerful tool to simplify your Angular tests

52 lines 8 kB
/** * @internal */ export function installProtoMethods(mock, proto, createSpyFn) { if (proto === null || proto === Object.prototype) { return; } for (const key of Object.getOwnPropertyNames(proto)) { const descriptor = Object.getOwnPropertyDescriptor(proto, key); if (!descriptor) { continue; } if (typeof descriptor.value === 'function' && key !== 'constructor' && typeof mock[key] === 'undefined') { mock[key] = createSpyFn(key); } else if (descriptor.get && !mock.hasOwnProperty(key)) { Object.defineProperty(mock, key, { set: (value) => (mock[`_${key}`] = value), get: () => mock[`_${key}`], configurable: true, }); } } installProtoMethods(mock, Object.getPrototypeOf(proto), createSpyFn); mock.castToWritable = () => mock; } /** * @publicApi */ export function createSpyObject(type, template) { const mock = { ...template } || {}; installProtoMethods(mock, type.prototype, (name) => { const newSpy = jasmine.createSpy(name); newSpy.andCallFake = (fn) => newSpy.and.callFake(fn); newSpy.andReturn = (val) => newSpy.and.returnValue(val); newSpy.reset = () => newSpy.calls.reset(); // revisit return null here (previously needed for rtts_assert). newSpy.and.returnValue(null); return newSpy; }); return mock; } /** * @publicApi */ export function mockProvider(type, properties) { return { provide: type, useFactory: () => createSpyObject(type, properties), }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWN0YXRvci9zcmMvbGliL21vY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUNBOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFJLElBQVMsRUFBRSxLQUFVLEVBQUUsV0FBcUI7SUFDakYsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakQsT0FBTztJQUNULENBQUM7SUFFRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLFNBQVM7UUFDWCxDQUFDO1FBRUQsSUFBSSxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssVUFBVSxJQUFJLEdBQUcsS0FBSyxhQUFhLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDeEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDL0IsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN6QyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQzFCLFlBQVksRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDbkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBSSxJQUErQixFQUFFLFFBQXdDO0lBQzFHLE1BQU0sSUFBSSxHQUFRLEVBQUUsR0FBRyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFFeEMsbUJBQW1CLENBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNwRCxNQUFNLE1BQU0sR0FBeUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RSxNQUFNLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBMkIsRUFBRSxFQUFFLENBQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkYsTUFBTSxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLGdFQUFnRTtRQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBSSxJQUErQixFQUFFLFVBQTBDO0lBQ3pHLE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSTtRQUNiLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQztLQUNwRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBDcmVkaXQ6IFZhbGVudGluIEJ1cnlha292ICovXG5pbXBvcnQgeyBGYWN0b3J5UHJvdmlkZXIsIFR5cGUsIEFic3RyYWN0VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG50eXBlIFdyaXRhYmxlPFQ+ID0geyAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gfTtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGF0aWJsZVNweSBleHRlbmRzIGphc21pbmUuU3B5IHtcbiAgLyoqXG4gICAqIEJ5IGNoYWluaW5nIHRoZSBzcHkgd2l0aCBhbmQucmV0dXJuVmFsdWUsIGFsbCBjYWxscyB0byB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBzcGVjaWZpY1xuICAgKiB2YWx1ZS5cbiAgICovXG4gIGFuZFJldHVybih2YWw6IGFueSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEJ5IGNoYWluaW5nIHRoZSBzcHkgd2l0aCBhbmQuY2FsbEZha2UsIGFsbCBjYWxscyB0byB0aGUgc3B5IHdpbGwgZGVsZWdhdGUgdG8gdGhlIHN1cHBsaWVkXG4gICAqIGZ1bmN0aW9uLlxuICAgKi9cbiAgYW5kQ2FsbEZha2UoZm46IEZ1bmN0aW9uKTogdGhpcztcblxuICAvKipcbiAgICogcmVtb3ZlcyBhbGwgcmVjb3JkZWQgY2FsbHNcbiAgICovXG4gIHJlc2V0KCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBTcHlPYmplY3Q8VD4gPSBUICYgeyBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIEZ1bmN0aW9uID8gVFtQXSAmIENvbXBhdGlibGVTcHkgOiBUW1BdIH0gJiB7XG4gIC8qKlxuICAgKiBDYXN0cyB0byB0eXBlIHdpdGhvdXQgcmVhZG9ubHkgcHJvcGVydGllc1xuICAgKi9cbiAgY2FzdFRvV3JpdGFibGUoKTogV3JpdGFibGU8VD47XG59O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFsbFByb3RvTWV0aG9kczxUPihtb2NrOiBhbnksIHByb3RvOiBhbnksIGNyZWF0ZVNweUZuOiBGdW5jdGlvbik6IHZvaWQge1xuICBpZiAocHJvdG8gPT09IG51bGwgfHwgcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90bykpIHtcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywga2V5KTtcblxuICAgIGlmICghZGVzY3JpcHRvcikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlID09PSAnZnVuY3Rpb24nICYmIGtleSAhPT0gJ2NvbnN0cnVjdG9yJyAmJiB0eXBlb2YgbW9ja1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgbW9ja1trZXldID0gY3JlYXRlU3B5Rm4oa2V5KTtcbiAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0ICYmICFtb2NrLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2NrLCBrZXksIHtcbiAgICAgICAgc2V0OiAodmFsdWUpID0+IChtb2NrW2BfJHtrZXl9YF0gPSB2YWx1ZSksXG4gICAgICAgIGdldDogKCkgPT4gbW9ja1tgXyR7a2V5fWBdLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpbnN0YWxsUHJvdG9NZXRob2RzKG1vY2ssIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byksIGNyZWF0ZVNweUZuKTtcblxuICBtb2NrLmNhc3RUb1dyaXRhYmxlID0gKCkgPT4gbW9jaztcbn1cblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcHlPYmplY3Q8VD4odHlwZTogVHlwZTxUPiB8IEFic3RyYWN0VHlwZTxUPiwgdGVtcGxhdGU/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBhbnk+Pik6IFNweU9iamVjdDxUPiB7XG4gIGNvbnN0IG1vY2s6IGFueSA9IHsgLi4udGVtcGxhdGUgfSB8fCB7fTtcblxuICBpbnN0YWxsUHJvdG9NZXRob2RzPFQ+KG1vY2ssIHR5cGUucHJvdG90eXBlLCAobmFtZSkgPT4ge1xuICAgIGNvbnN0IG5ld1NweTogamFzbWluZS5TcHkgJiBQYXJ0aWFsPENvbXBhdGlibGVTcHk+ID0gamFzbWluZS5jcmVhdGVTcHkobmFtZSk7XG4gICAgbmV3U3B5LmFuZENhbGxGYWtlID0gKGZuOiAoLi4uYXJnczogYW55W10pID0+IGFueSkgPT4gPGFueT5uZXdTcHkuYW5kLmNhbGxGYWtlKGZuKTtcbiAgICBuZXdTcHkuYW5kUmV0dXJuID0gKHZhbCkgPT4gbmV3U3B5LmFuZC5yZXR1cm5WYWx1ZSh2YWwpO1xuICAgIG5ld1NweS5yZXNldCA9ICgpID0+IG5ld1NweS5jYWxscy5yZXNldCgpO1xuICAgIC8vIHJldmlzaXQgcmV0dXJuIG51bGwgaGVyZSAocHJldmlvdXNseSBuZWVkZWQgZm9yIHJ0dHNfYXNzZXJ0KS5cbiAgICBuZXdTcHkuYW5kLnJldHVyblZhbHVlKG51bGwpO1xuXG4gICAgcmV0dXJuIG5ld1NweTtcbiAgfSk7XG5cbiAgcmV0dXJuIG1vY2s7XG59XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1Byb3ZpZGVyPFQ+KHR5cGU6IFR5cGU8VD4gfCBBYnN0cmFjdFR5cGU8VD4sIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBhbnk+Pik6IEZhY3RvcnlQcm92aWRlciB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZTogdHlwZSxcbiAgICB1c2VGYWN0b3J5OiAoKSA9PiBjcmVhdGVTcHlPYmplY3QodHlwZSwgcHJvcGVydGllcyksXG4gIH07XG59XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgdHlwZSBNb2NrUHJvdmlkZXIgPSB0eXBlb2YgbW9ja1Byb3ZpZGVyO1xuIl19