我正在构建一个使用Web音频api(更具体的说是ToneJS)的库。
我尝试使用 jsdom,mocha-jsdom 失败。
我收到此错误-
node_modules/tone/build/Tone.js:3869
this.input = this.output = this._gainNode = this.context.createGain();
这很有意义,并告诉我我需要使用具有上下文的环境。
我什至不确定如何为project设置测试。
如何为项目正确设置测试环境?
答案 0 :(得分:2)
我建议您在单元测试中不要使用Tone.js。 Tone.js仅在浏览器中有效,因为它需要Web Audio 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之类的东西编写更高级的测试。