如何在Jasmine测试中释放AudioContext

时间:2015-09-22 16:09:53

标签: javascript angularjs unit-testing karma-jasmine audiocontext

我有一个Angular服务,用于设置audioContext。 Jasmine正在为每个测试创建一个新服务,因此在经过6次测试后,所有测试都会失败并显示错误:

AudioPlayer.context.close()

我有办法在测试之间清除AudioContext吗?我在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
  });

});

和测试看起来有点像这样:

elements = NSMutableDictionary()
ftitle = NSMutableString()

感谢您的帮助!

这是一个说明问题的jsFiddle: How to search by attribute value

2 个答案:

答案 0 :(得分: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 :(得分:1)

你可以关闭它。

    audioCtx.close();

参见文档 audioContext.close()