0

所以我的代码如下所示:

import FsAsyncFactory from '../fs/FsAsyncFactory'
import ObjectHelper from '../utils/ObjectHelper'
import Config from './Config'

export class ConfigHelper {

    // this is the function under test
    public static async primeCacheObj(): Promise<void> {

        const configFileObj: any = await ConfigHelper.getConfigFileObj()

    }

    private static configCacheObj: Config = null

    private static async getConfigFileObj(): Promise<any> {
        const fsAsync: any = FsAsyncFactory.getFsAsync()
        const fileContents: string = await fsAsync.readFileAsync('./config/hubnodeConfig.json')

        return JSON.parse(fileContents)
    }

}

export default ConfigHelper

让我的单元测试代码阻止它实际访问磁盘的最佳方法是什么?

我应该使用 InversifyJS 之类的东西来允许依赖注入吗?我有一个初始化脚本,它会在应用程序正常运行时设置“默认值”,然后在测试中“覆盖”这些默认值?

4

1 回答 1

1

在 JavaScript 中,传统上人们一直使用猴子补丁来编写单元测试。

我个人认为猴子补丁是一种不好的做法,会导致无法维护的代码。我更喜欢依赖注入,这就是我创建 InversifyJS 的原因。

您可以使用 InversifyJS覆盖单元测试上的绑定

这意味着将通过依赖注入ConfigHelper获得一个实例。FsAsync

@injectable()
export class ConfigHelper {

    @inject("FsAsync") private readonly _fsAsync: FsAsync;

    // this is the function under test
    public static async primeCacheObj(): Promise<void> {

        const configFileObj: any = await ConfigHelper.getConfigFileObj()

    }

    private static configCacheObj: Config = null

    private static async getConfigFileObj(): Promise<any> {
        const json = await this_fsAsync.readFileAsync('./xxx.json')
        return JSON.parse(json)
    }

}

在单元测试期间,您可以替换FsAsync类型绑定:

container.bind<FsAsync>("FsAsync")
         .toDynamicValue(() => FsAsyncFactory.getFsAsync());

注入模拟:

container.rebind<FsAsync>("FsAsync")
         .toDynamicValue(() => ({
             readFileAsync: (path) => {
                 return Promise.resolve("{ hardCodedJson: "happy days!" }");
             }
         }));
于 2017-12-15T12:03:04.337 回答