在 Jest 中模拟 AudioContext()

问题描述 投票:0回答:2

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

....
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

我还发现了这个,它似乎可以工作,只是它要求您在代码中使用该函数的模拟版本,而不是像我一直在使用

random()
那样重载它。

我想更换jsdom作为我的测试环境,但是我一直没能找到支持的

AudioContext()

有没有一种解决方案可以让我不改变源代码?在运行时传递到调用

AudioContext()
模拟或函数
AudioContext
的函数?

unit-testing jestjs mocking audiocontext
2个回答
3
投票

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

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

global.AudioContext = AudioContext;

但是,我自己并不是 Jest 用户。如果它不起作用,请告诉我,并随时针对您遇到的任何错误提出问题


0
投票

另一个答案提到的

standardized-audio-context-mock
包对我不起作用,因为当我尝试使用它进行构建时,我收到了与它如何导出内容相关的错误。对我有用的是在我的测试设置文件中嘲笑
AudioContext
的实现:

setupTests.ts

window.AudioContext = jest.fn().mockImplementation(() => ({
  createMediaStreamSource: jest.fn(),
  createMediaElementSource: jest.fn(),
  createBufferSource: jest.fn().mockImplementation(() => ({
    connect: jest.fn(),
    start: jest.fn(),
    stop: jest.fn(),
    loop: false,
  })),
  decodeAudioData: jest.fn().mockImplementation((buffer, successCallback, errorCallback) => {
    successCallback(buffer);
  }),
  destination: {},
}));
© www.soinside.com 2019 - 2024. All rights reserved.