A mocked version of the standardized-audio-context module.
This library is meant to test code which is using standardized-audio-context
without acutally rendering any audio.
It does depend on Sinon.JS to do the mocking.
standardized-audio-context-mock
is published on
npm and can be installed as usual.
npm install standardized-audio-context-mock
Let's say you have the following code that you want to test:
// File `./play.ts`
import { IAudioBuffer, IAudioContext } from 'standardized-audio-context';
export const play = (audioBuffer: IAudioBuffer, audioContext: IAudioContext) => {
const audioBufferSourceNode = audioContext.createBufferSource();
audioBufferSourceNode.buffer = audioBuffer;
audioBufferSourceNode.connect(audioContext.destination);
audioBufferSourceNode.start();
};
A test suite for the play()
function which will run with Mocha and Chai and uses standardized-audio-context-mock
might look like this:
// File `./play.test.js`
import { AudioBuffer, AudioContext, registrar } from 'standardized-audio-context-mock';
import { play } from './play';
describe('play()', () => {
let audioBufferMock;
let audioContextMock;
afterEach(() => registrar.reset());
beforeEach(() => {
audioBufferMock = new AudioBuffer({ length: 10, sampleRate: 44100 });
audioContextMock = new AudioContext();
});
it('should create a new AudioBufferSourceNode', () => {
play(audioBufferMock, audioContextMock);
expect(registrar.getAudioNodes(audioContextMock, 'AudioBufferSourceNode')).to.have.a.lengthOf(1);
});
it('should set the buffer property of the AudioBufferSourceNode', () => {
play(audioBufferMock, audioContextMock);
const [audioBufferSourceNodeMock] = registrar.getAudioNodes(audioContextMock, 'AudioBufferSourceNode');
expect(audioBufferSourceNodeMock.buffer).to.equal(audioBufferMock);
});
it('should connect the AudioBufferSourceNode with to destination', () => {
play(audioBufferMock, audioContextMock);
const [audioBufferSourceNodeMock] = registrar.getAudioNodes(audioContextMock, 'AudioBufferSourceNode');
expect(audioBufferSourceNodeMock.connect).to.have.been.calledOnce;
expect(audioBufferSourceNodeMock.connect).to.have.been.calledWithExactly(audioContextMock.destination);
});
it('should start the AudioBufferSourceNode', () => {
play(audioBufferMock, audioContextMock);
const [audioBufferSourceNodeMock] = registrar.getAudioNodes(audioContextMock, 'AudioBufferSourceNode');
expect(audioBufferSourceNodeMock.start).to.have.been.calledOnce;
});
});