使用 Mocha & Chai 测试使用网络音频 API 的库
Testing A Library That Uses The Web Audio API With Mocha & Chai
我正在构建一个使用网络音频的库 api(更具体地说是 ToneJS)。
我尝试使用 jsdom、mocha-jsdom 但没有成功。
我收到这个错误 -
node_modules/tone/build/Tone.js:3869
this.input = this.output = this._gainNode = this.context.createGain();
这很有道理,告诉我我需要使用具有上下文的环境。
我什至不确定我应该如何为我的project设置测试。
我应该如何为我的项目正确设置测试环境?
我建议您在单元测试中完全不要使用 Tone.js。 Tone.js 仅适用于浏览器,因为它需要网络音频 API。相反,您可以使用 Tone.js 的 spy/mock/stub,这只是确保您按预期使用 Tone。
例如,如果您想为 AudioManager 编写测试,您可以创建一个 Tone.js 的精简模拟,它只提供您所需要的。
const FakeTone = {
Players: function () { },
context: { resume () { } }
};
接下来我建议重写 AudioManager,使其接受 Tone 作为构造函数参数而不是导入它。这将使测试变得容易得多。而不是...
import Tone from 'tone';
export class AudioManager {
// ...
generatePlayers () {
return new Tone.Players()
}
// ...
}
...然后会是...
export class AudioManager {
constructor (Tone) {
this.Tone = Tone;
}
// ...
generatePlayers () {
return new this.Tone.Players();
}
// ...
}
...一开始看起来有点难看,但希望过一段时间后你就会习惯了。 :-)
这将允许您使用 FakeTone 对象测试 AudioManager。
const audioManager = new AudioManager(FakeTone);
expect(audioManager.generatePlayers()).to.be.an.instanceOf(FakeTone.Players);
您还可以使用 Sinon.JS 之类的东西来编写更高级的测试。
我正在构建一个使用网络音频的库 api(更具体地说是 ToneJS)。
我尝试使用 jsdom、mocha-jsdom 但没有成功。
我收到这个错误 -
node_modules/tone/build/Tone.js:3869
this.input = this.output = this._gainNode = this.context.createGain();
这很有道理,告诉我我需要使用具有上下文的环境。
我什至不确定我应该如何为我的project设置测试。
我应该如何为我的项目正确设置测试环境?
我建议您在单元测试中完全不要使用 Tone.js。 Tone.js 仅适用于浏览器,因为它需要网络音频 API。相反,您可以使用 Tone.js 的 spy/mock/stub,这只是确保您按预期使用 Tone。
例如,如果您想为 AudioManager 编写测试,您可以创建一个 Tone.js 的精简模拟,它只提供您所需要的。
const FakeTone = {
Players: function () { },
context: { resume () { } }
};
接下来我建议重写 AudioManager,使其接受 Tone 作为构造函数参数而不是导入它。这将使测试变得容易得多。而不是...
import Tone from 'tone';
export class AudioManager {
// ...
generatePlayers () {
return new Tone.Players()
}
// ...
}
...然后会是...
export class AudioManager {
constructor (Tone) {
this.Tone = Tone;
}
// ...
generatePlayers () {
return new this.Tone.Players();
}
// ...
}
...一开始看起来有点难看,但希望过一段时间后你就会习惯了。 :-)
这将允许您使用 FakeTone 对象测试 AudioManager。
const audioManager = new AudioManager(FakeTone);
expect(audioManager.generatePlayers()).to.be.an.instanceOf(FakeTone.Players);
您还可以使用 Sinon.JS 之类的东西来编写更高级的测试。