0

У меня есть служба углов, которая настраивает аудиоконтекст. Жасмин создает новую услугу для каждого теста, поэтому после 6 тестов всех испытаний завершаться с ошибкой:Как освободить AudioContext в тестах Жасмина

Error: Failed to construct 'AudioContext': The number of hardware contexts provided (6) is greater than or equal to the maximum bound (6).

Есть ли способ для меня, чтобы очистить AudioContext между испытаниями? Я пробовал AudioPlayer.context.close() в блоке afterEach, но, похоже, не работает.

услуга выглядит вроде как это:

angular.module('myApp') 
    .service('AudioPlayer', function() { 

    var self = this; 

    self.context = new AudioContext(); 

    this.doSomething = function() { 
     // doing super cool testable stuff here 
    } 
    }) 

и тесты выглядит вроде как это:

describe('AudioPlayer', function() { 
    var AudioPlayer; 

    beforeEach(function() { 
    inject(function ($injector) { 
     AudioPlayer = $injector.get('AudioPlayer'); 
    }); 
    }); 

    afterEach(function() { 
    AudioPlayer.context.close(); 
    }); 

    it('does cool stuff', function() { 
    AudioPlayer.doSomething();  
    // unit test 
    }); 

    it('does other cool stuff', function() { 
    AudioPlayer.doSomething();  
    // unit test 
    }); 

}); 

Спасибо за помощь!

Вот является jsFiddle, иллюстрирующий проблему: http://jsfiddle.net/briankeane/cp929can/1/

+0

у вас есть 'уаг себя = это,' там правильно? –

+0

также, пожалуйста, добавьте код 'afterEach' с частью очистки –

+0

ok, done. Что дальше? – lonesomewhistle

ответ

1

я в конечном итоге создание контекста одиночки, как в тестах, то гася конструктор с функцией, которая возвращает тот же AudioContext ... вот окончательный тестовый код:

describe('AudioPlayer', function() { 
    var AudioPlayer; 
    var context = new AudioContext();  // create the AudioContext once 

    beforeEach(function() { 
    module('myApp'); 

    inject(function ($injector) { 
     spyOn(window, 'AudioContext').and.callFake(function() { 
     return context;    // stub the constructor 
     }); 
     AudioPlayer = $injector.get('AudioPlayer'); 
    }); 
    }); 

    for (var i=0;i<7;i++) { 
     it('does cool stuff', function() { 
     AudioPlayer.doSomething(); 
     expect(true).toBe(true); 
     // unit test 
     }); 
    } 
}); 

А вот рабочая скрипку: http://jsfiddle.net/briankeane/3ctngs1u/

Надеюсь, это поможет кому-то из.

1

вы можете просто закрыть его.

audioCtx.close(); 

см документации audioContext.close()

+0

В настоящий момент это правильный ответ. Я не знаю, был ли 'close()' доступен еще в '15. – Michael

+0

Это неверно - в вопросе я говорю: «Я попытался использовать AudioPlayer.context.close() в блоке afterEach, но, похоже, не работает». Образец кода в вопросе также содержит context.close(). Попытка этого в современном браузере по-прежнему дает тот же результат. Не уверен, почему он не работает, как говорится в документации. – lonesomewhistle

+0

Почему close() не работает? Вы получили сообщение об ошибке? Вы можете закрыть его, только если он открыт. поэтому требуется проверка состояния === running или state! == closed. – bobbdelsol

Смежные вопросы