Karma测试:PhantomJS:ReferenceError:找不到变量:Audio

use*_*171 2 audio html5 phantomjs angularjs karma-jasmine

我正在尝试使用Karma和PhantomJS来测试我的应用程序,我收到错误:

   PhantomJS 1.9.8 (Windows 7) Controller: SongsCtrl should attach a list of awesomeThings to the scope FAILED
ReferenceError: Can't find variable: Audio
Run Code Online (Sandbox Code Playgroud)

我的AngularJS服务中的违规行是:

   var audio = new Audio();
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中运行它时,当然可以正常运行,但由于它是原生HTML5元素,因此PhantomJS似乎无法识别它.

有谁知道我怎么解决这个问题?

Mic*_*ord 6

PhantomJS 1.9.x 不支持 HTML5的视频和音频标签.似乎v2.0 也没有.

但是您可以通过在测试中执行以下操作来轻松模拟它(我假设您使用的是Jasmine):

describe('My test', function() {
    var audioOriginal, audioMock;

    beforeEach(function() {
        audioOriginal = window.Audio;
        audioMock = {};
        window.Audio = function() { return audioMock; });
    });

    afterEach(function() {
        window.Audio = audioOriginal;
    });

    it('should call the play method', function() {
        // Arrange
        audioMock.play = jasmine.createSpy('play');

        // Act
        // Calls Audio.play() somehow

        // Assert
        expect(audioMock.play).toHaveBeenCalled();
    });
});
Run Code Online (Sandbox Code Playgroud)

工作的Plunker

请注意,每次测试后都会恢复原始音频值.这很重要,因为我们正在更改window对象,这是全局的,如果我们不回滚该更改,那么依赖的其他测试Audio可能会中断.