在Mocha&Chai中测试使用Web Audio API的库

时间:2019-03-21 00:38:31

标签: node.js testing mocha web-audio jsdom

我正在构建一个使用Web音频api(更具体的说是ToneJS)的库。

我尝试使用 jsdom,mocha-jsdom 失败。

我收到此错误-

node_modules/tone/build/Tone.js:3869
                this.input = this.output = this._gainNode = this.context.createGain();

这很有意义,并告诉我我需要使用具有上下文的环境。

我什至不确定如何为project设置测试。

如何为项目正确设置测试环境?

1 个答案:

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