From a55b90ac99e3b68542bac34e3b4c82eafb0af072 Mon Sep 17 00:00:00 2001 From: rezoled Date: Wed, 24 Jul 2024 11:22:55 +0300 Subject: [PATCH 1/2] fixed generator functions --- src/utils/ObjectPropertyCodeRetriever.ts | 3 ++- test/mocking.types.spec.ts | 30 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/utils/ObjectPropertyCodeRetriever.ts b/src/utils/ObjectPropertyCodeRetriever.ts index ad35c10..74fd6f4 100644 --- a/src/utils/ObjectPropertyCodeRetriever.ts +++ b/src/utils/ObjectPropertyCodeRetriever.ts @@ -13,7 +13,8 @@ export class ObjectPropertyCodeRetriever { ]; } else if (typeof object[prop] === 'function') { const fnStr = String(object[prop]); - const isMethod = fnStr.startsWith(prop) || fnStr.startsWith(`async ${prop}`); + const gx = new RegExp(`^(async)?\\s{0,}\\*?${prop}`); + const isMethod = gx.test(fnStr); return ` ${isMethod ? fnStr : `${prop}: ${fnStr}`} `; diff --git a/test/mocking.types.spec.ts b/test/mocking.types.spec.ts index 7e224bb..6876e8e 100644 --- a/test/mocking.types.spec.ts +++ b/test/mocking.types.spec.ts @@ -248,6 +248,13 @@ describe("mocking", () => { expect(mocked).toBeDefined(); }); }); + + describe("mocking generator class", () => { + it("should mock", () => { + const mocked = mock(getGeneratorClass()); + expect(mocked).toBeDefined(); + }); + }); }); abstract class SampleAbstractClass { @@ -332,3 +339,26 @@ export class AsyncClass { return 0; } } + +// tslint:disable-next-line:no-eval +const getGeneratorClass = () => eval(`class GeneratorClass { + + asyncValueFn = async function* hello() { + return 'value'; + }; + + valueFn = function* hello() { + return 'value'; + }; + + async *returnAsyncValue() { + return 0; + } + + *returnValue() { + return 0; + } +} + +GeneratorClass +`); From f07ad1035a847c8439973de47a9e11e07077d8af Mon Sep 17 00:00:00 2001 From: rezoled Date: Wed, 24 Jul 2024 11:23:43 +0300 Subject: [PATCH 2/2] fixed generator functions --- test/mocking.types.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/mocking.types.spec.ts b/test/mocking.types.spec.ts index 6876e8e..5416d8d 100644 --- a/test/mocking.types.spec.ts +++ b/test/mocking.types.spec.ts @@ -340,6 +340,7 @@ export class AsyncClass { } } +// Generator functions in eval to prevent downcompiling generators to classic functions // tslint:disable-next-line:no-eval const getGeneratorClass = () => eval(`class GeneratorClass {