问题描述
我正在构建一个使用Web音频api(更具体的说是ToneJS)的库.
I am building a library which uses the web audio api(ToneJS to be more specific).
我尝试使用 jsdom,mocha-jsdom 没有成功.
我收到此错误-
node_modules/tone/build/Tone.js:3869
this.input = this.output = this._gainNode = this.context.createGain();
这很有意义,并告诉我我需要使用具有上下文的环境.
Which makes sense and tells me that i need to use an environment with a context.
我什至不确定如何为我的项目设置测试.
I'm not even sure how i should setup the tests for my project.
我应该如何为我的项目正确设置测试环境?
How should i setup a test environment correctly for my project?
推荐答案
我建议在单元测试中完全不要使用Tone.js. Tone.js仅在浏览器中有效,因为它需要Web Audio API.相反,您可以使用Tone.js的间谍/模拟/存根(Spy/mock/stub),只需确保您按预期使用Tone.
I would suggest to not use Tone.js at all in your unit tests. Tone.js only works in the browser as it requires the Web Audio API. Instead you could use a spy/mock/stub of Tone.js which just makes sure that you use Tone as intended.
例如,如果您要编写 AudioManager ,您可以创建一个Tone.js的简化模型,该模型仅提供您所需的内容.
If you for example want to write a test for the AudioManager you could create a stripped down mock of Tone.js which just provides what you need.
const FakeTone = {
Players: function () { },
context: { resume () { } }
};
接下来,我建议重写AudioManager,使其接受Tone作为构造函数参数,而不是将其导入.这将使测试变得容易得多.代替...
Next I would recommend to rewrite the AudioManager in a way that it accepts Tone as a constructor argument instead of importing it. This will make testing a lot easier. Instead of ...
import Tone from 'tone';
export class AudioManager {
// ...
generatePlayers () {
return new Tone.Players()
}
// ...
}
...那将是...
... it would then be ...
export class AudioManager {
constructor (Tone) {
this.Tone = Tone;
}
// ...
generatePlayers () {
return new this.Tone.Players();
}
// ...
}
...乍一看有点难看,但希望您会在一段时间后习惯它. :-)
... which looks a bit ugly at first, but you hopefully get used to it after a while. :-)
这将允许您使用FakeTone对象测试AudioManager.
This will allow you to test the AudioManager with the FakeTone object.
const audioManager = new AudioManager(FakeTone);
expect(audioManager.generatePlayers()).to.be.an.instanceOf(FakeTone.Players);
您还可以使用 Sinon.JS 之类的东西来编写更高级的测试.
You could also use something like Sinon.JS to write more advanced tests.
这篇关于在Mocha&中测试使用Web音频API的库hai的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!