Тестирование библиотеки, которая использует Web Audio API с Mocha и Chai - PullRequest
0 голосов
/ 21 марта 2019

Я создаю библиотеку, которая использует веб-аудио API (ToneJS, чтобы быть более конкретным).

Я пытался использовать jsdom, mocha-jsdom , но безуспешно.

Я получаю эту ошибку -

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

Что имеет смысл и говорит мне, что мне нужно использовать среду с контекстом.

Я даже не уверен, как мне настроить тесты для моего проекта .

Как правильно настроить тестовую среду для моего проекта?

1 Ответ

2 голосов
/ 02 апреля 2019

Я бы предложил вообще не использовать Tone.js в ваших юнит-тестах. Tone.js работает только в браузере, так как для этого требуется API-интерфейс Web Audio. Вместо этого вы могли бы использовать шпион / заглушку / заглушку Tone.js, которая просто гарантирует, что вы используете 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();
    }

    // ...

}

... поначалу это выглядит немного некрасиво, но, надеюсь, через некоторое время вы к этому привыкнете. : -)

Это позволит вам протестировать AudioManager с объектом FakeTone.

const audioManager = new AudioManager(FakeTone);

expect(audioManager.generatePlayers()).to.be.an.instanceOf(FakeTone.Players);

Вы также можете использовать что-то вроде Sinon.JS для написания более сложных тестов.

...