使用 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 之类的东西来编写更高级的测试。