【问题标题】:mocking AudioContext() in Jest在 Jest 中模拟 AudioContext()
【发布时间】:2022-01-09 03:57:16
【问题描述】:

我的项目中的函数中有以下代码;

....
if (state.context == null) {
    return {
        ...state,
        context: new AudioContext()
    }
}
....

我正在尝试在 Jest 中测试这种行为。但是,Jest 使用的 jsdom 不支持 AudioContext()

在我使用的其他测试中;

.....
jest.spyOn(global.Math, 'random').mockReturnValue(0.3);
....
jest.spyOn(global.Math, 'random').mockRestore();
....

这不起作用。当我打电话给spyOn(global /* or window */, 'AudioContext') 时,我收到错误Cannot spy the AudioContext property because it is not a function; undefined given instead

我还发现了这个library,它似乎可以工作,只是它要求您在代码中使用函数的模拟版本,而不是像我对random() 所做的那样重载它。

我会替换 jsdom 作为我的测试环境,但是我一直找不到支持AudioContext() 的环境。

是否有不更改源代码的解决方案?在运行时向调用AudioContext() 的函数传递一个模拟或函数AudioContext

【问题讨论】:

    标签: unit-testing jestjs mocking audiocontext


    【解决方案1】:

    我是问题中提到的图书馆的作者。我认为以下应该可行。

    import { AudioContext } from 'standardized-audio-context-mock';
    
    global.AudioContext = AudioContext;
    

    但是,我自己不是 Jest 用户。如果它不起作用,请告诉我,如果您遇到任何错误,请随时open an issue

    【讨论】:

    • 如何重置?
    • 你的意思是如何从全局对象中再次删除它?我希望delete global.AudioContext 能够工作。
    • global.AudioContext = AudioContext;delete global.AudioContext 生成打字稿错误。
    • 发生delete 错误是因为global.AudioContext 被设置为undefined 以解决此问题,我保存了对该函数的引用并在完成该测试后恢复它。跨度>
    猜你喜欢
    • 2019-09-01
    • 2017-08-09
    • 2020-06-09
    • 2020-06-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 2019-08-17
    相关资源
    最近更新 更多