【问题标题】:How to initialize private property of a class for a test如何为测试初始化​​一个类的私有属性
【发布时间】:2021-04-13 05:05:36
【问题描述】:

我正在尝试使用 JEST 为我编写的具有类似于以下静态属性的类编写测试:

class DataManager {
    static #data = null;

    static getData = () => {
        return this.#data;
    }

    static initializeData = async () => {
        await database(async (db) => {
            const data = getSomeDataFromDatabase() //just example
            this.#data = data;
        });
    }
}

现在,我想为我的 initializeData 方法做一个新的实现,返回一些模拟数据而不是去数据库,然后“getData”看看我是否得到了预期的结果。问题是我的#data 属性是私有的,我不想将它暴露给外界。有什么办法吗?

【问题讨论】:

  • 为什么要使用static
  • 补充@Tibebes.M:……和why are you using class?
  • Tibebes.M & @Bergi 我不使用任何带有依赖注入机制的框架,我想避免在不同文件之间传播实例。此外,我需要一些可以在应用程序之间共享的内存数据。因为所有这些函数都使用相同的数据,所以我认为将它放在一个地方是一个好习惯,我认为一个类是一种合适的方式。
  • 放在一个地方,是的,但是一个简单的模块或对象字面量就足够了。 classes 当你想实例化多个对象时应该使用。

标签: javascript testing jestjs ecmascript-next class-fields


【解决方案1】:

不,没有办法做到这一点。 私有字段确实是私有的。如果您想在测试中模拟它们,请不要使用私有字段。或者反过来:如果它们是私有的(实现细节),则不应模拟它们。

您需要模拟整个DataManager 类及其公共方法,或者如果您想测试DataManager 本身,那么您需要模拟它调用的databasegetSomeDataFromDatabase 函数。

【讨论】:

  • 谢谢@Bergi,我采纳了你的建议,它奏效了
  • @OhadYeahhh 很高兴能帮上忙!你可能想accept the answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多