我的项目中的函数中有以下代码;
....
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
的函数?
我是问题中提到的图书馆的作者。我认为以下应该有效。
import { AudioContext } from 'standardized-audio-context-mock';
global.AudioContext = AudioContext;
但是,我自己并不是 Jest 用户。如果它不起作用,请告诉我,并随时针对您遇到的任何错误提出问题。
另一个答案提到的
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: {},
}));