Rhum 无法模拟 Typescript 中的 Mixin class

Mixin class in Typescript cannot be mocked by Rhum

大家好,我的这段代码在最后一行失败了。一旦它被注释掉,它就会按预期通过。问题是在模拟 mixin class.

有人对如何处理这个问题有任何想法、建议或想法吗?

我是运行这个人:

谢谢。

import { Rhum } from "https://deno.land/x/rhum@v1.1.10/mod.ts";
import { assertInstanceOf } from "https://deno.land/std@0.132.0/testing/asserts.ts";

export interface IGame {}

export class NullGame implements IGame {}

function WithGameProperty() {
    return <T extends new (...args: any[]) => any>(GameProperty: T) => {
        return class extends GameProperty {
            private game: IGame = new NullGame();

            public set Game(game: IGame) {
                this.game = game;
            }

            public get Game() {
                return this.game;
            }
        };
    };
}

const PlayersEngine = WithGameProperty()(
    class PlayersEngine {
        onNextGenerationReady(listener: () => void): void {
        // add listener to react on an event
        }

        prepareNextGeneration(): void {
        // do some stuff and trigger an event
        }
    },
);

const pe = new PlayersEngine();

pe.Game = new NullGame();

assertInstanceOf(pe.Game, NullGame);

Rhum.mock(NullGame).create();
Rhum.mock(PlayersEngine).create();

作为参考,我是 Rhum 的维护者之一。

问题在于 Rhum 的内部代码,我们获取属性的逻辑不适用于 getter 和 setter。我试过这个并设法得到了一个有效的修复,所以它根本不是你的代码。

例如:

let desc = Object.getOwnPropertyDescriptor(original, property);
if (desc === undefined) {
  // property is a getter or setter
  desc = Object.getOwnPropertyDescriptor(this.constructor_fn.prototype, property)
}
// We can now use `desc.value`

我将为此添加一个修复程序和一个测试用例,并将在今晚发布一个新的补丁版本,所以请密切关注发布:)