gpt4 book ai didi

javascript - Angular.js 单元测试 "inject()"在 "run"阶段 block 之前触发

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:17:44 24 4
gpt4 key购买 nike

我有一个场景,我试图为移动设备加载 HTML5 音频,这只能通过用户交互(例如 ontouchstart)来实现。我已经在 Angular 运行阶段实现了这个逻辑,以确保尽早附加它。我无法在配置阶段附加它,因为它依赖于其他 Angular 工厂:

angular.module('MyModule')
.run(['Device', 'ResourceManager', 'ExceptionFactory', function (Device, ResourceManager, ExceptionFactory) {
if (!Device.browser.features.webaudio) {
var onFirstUserInteraction = function () {
var sounds = ResourceManager.getSounds();

if (sounds.length > 1) {
throw ExceptionFactory.create('Html5AudioLimitReachedException', 'Html5 Audio Devices can only load one sound resource');
}

if (sounds.length === 1) {
sounds[0].createBrowserAudioObject();
}

document.documentElement.removeEventListener(Device.browser.is.IE ? 'click' : 'touchstart', onFirstUserInteraction, true);
};

document.documentElement.addEventListener(Device.browser.is.IE ? 'click' : 'touchstart', onFirstUserInteraction, true);
}
}]);

我有以下单元测试失败,因为上面的事件处理程序没有及时注册:

beforeEach(function () {
angular.module('Html5SoundLoaderApp', [])
.run(['Device', 'ResourceManager', function (Device, ResourceManager) {
Device.browser.features.webaudio = false;
ResourceManager.addSound('testOne', 'test/url/testOne.mp3', {});
ResourceManager.addSound('testTwo', 'test/url/testTwo.mp3', {});
}]);

module('Html5SoundLoaderApp');
});

it('should only be able to load one sound resource', inject(['ExceptionFactory', function (ExceptionFactory) {
var spy = sinon.spy(ExceptionFactory, 'create');

expect(function () {
angular.mock.ui.trigger(document.documentElement, 'touchstart')
}).to.throw();

spy.should.have.been.calledOnce;
spy.should.have.been.calledWith('Html5AudioLimitReachedException', 'Html5 Audio Devices can only load one sound resource');
}]));

我会期望 run() block 在测试开始之前完成执行吗?我这个假设错了吗?如果是这样,如何最好地解决这种情况?

谢谢

最佳答案

这段代码对我来说看起来是异步的(一方面,因为它在等待用户交互),所以使用 done() 回调:

beforeEach(function (done) { // <--- Add this parameter.
angular.module('Html5SoundLoaderApp', [])
.run(['Device', 'ResourceManager', function (Device, ResourceManager) {
Device.browser.features.webaudio = false;
ResourceManager.addSound('testOne', 'test/url/testOne.mp3', {});
ResourceManager.addSound('testTwo', 'test/url/testTwo.mp3', {});
done(); // <--- It looks to me like this is where done() should be called.
}]);

module('Html5SoundLoaderApp');
});

您必须对任何异步执行的工作使用done()。否则,Mocha 会继续前进,而不会等待工作执行完毕。

关于javascript - Angular.js 单元测试 "inject()"在 "run"阶段 block 之前触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21825187/

24 4 0
文章推荐: javascript - 如何将文件拖到
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com