9

Я пытался покрыть <audio> тегом автоматическими тестами, чтобы начать с того, чтобы подтвердить, что он играет.Как протестировать звук?

Я использую обычный набор угловых тестов, карму и транспортир.

"devDependencies": { 
    "karma": "~0.10", 
    "protractor": "~0.20.1", 
    "http-server": "^0.6.1", 
    "bower": "^1.3.1", 
    "shelljs": "^0.2.6", 
    "karma-junit-reporter": "^0.2.2", 
    "grunt": "~0.4.1", 
    "grunt-contrib-uglify": "~0.2.0", 
    "grunt-contrib-concat": "~0.3.0", 
    "grunt-contrib-watch": "~0.4.3" 
} 

На стороне Карма вопрос, я не мог найти способ, чтобы добавить ресурсы потенциально использовать в тестах, так ни один файл не играть там. Если бы был способ указать на файл для воспроизведения, это не должно было быть проблемой, поскольку я мог просто проверить свойство paused этого элемента.

На стороне 2e2 есть демонстрационное приложение, которое прекрасно работает, тест может загрузить его просто отлично, и нажатие одной из кнопок не вызывает никаких ошибок (оно вызывает звук при попытке вручную). Однако, глядя в API-интерфейс транспортира, я не мог найти ничего, что могло бы позволить мне убедиться, что звук на самом деле играет или позволяет мне получить доступ к элементу, так как даже document и angular недоступны здесь (что имеет смысл как тестирование 2e2) или просто API для проверки свойств элемента.

beforeEach(function() { 
    browser.get("index.html") 
}); 

it("Ensure the player is playing", function() { 

    $$("button").first().click(); 

    // what to do? 

}); 

я подумал о возможности насмешливого аудио API и просто поддельные свойства обновляются, но тогда я еще тестирую против моего кода и currentTime будет очень трудно дразнить точно, когда моя конечная цель заключается в проверку звук в звуковом спрайте начинается и останавливается, когда ожидается.

В идеале я хочу прикрыть это в модульных тестах, где это должно быть, поэтому было бы удобно использовать рабочий ресурс. Так что простое expect(!element[0].paused).toEqual(true); будет достаточно, чтобы знать, что он играет.

Как я могу служить файлу в своих модульных тестах для использования в качестве источника звука?

+0

Будет ли проверка звуковой метки на 0:00 достаточной? –

+0

В случае, когда вы можете воспроизвести файл, тогда 'paused' должно быть достаточно, и да, проверка' currentTime' не '0' тоже будет работать, но проблема здесь в том, что в тестах нет файла для воспроизведения (может ' t найти способ служить одному), чтобы эти свойства никогда не менялись. – GillesC

+0

ah sorry miss понял, мне будет жалко извините –

ответ

12

Предполагая, что вы играете звук с использованием HTML5 <audio /> под капотом, вы можете сделать следующее - в основном используйте browser.executeScript для доступа к pause, как вы хотели. Вам нужно будет перейти к тэгу <audio />; в этом случае он был первым. Это работает в моей песочнице. Примечание: я не являюсь аффилированным лицом с угловым медиа-плеером - это был первый результат в Google, который я мог бы использовать для работы с транспортиром - я использую его, когда смогу.

describe('angularjs homepage', function() { 
    it('should have a title', function() { 
    browser.get('http://mrgamer.github.io/angular-media-player/interactive.html'); 

    // add a song to the playlist 
    element(by.repeater('song in prefabPlaylist')).click(); 

    // hook into the browser 
    var isPaused = function() { 
     return browser.executeScript(function() { 
      return document.getElementsByTagName('audio')[0].paused; 
     }); 
    }; 

    // make sure it's not playing 
    expect(isPaused()).toBe(true); 

    // start playing 
    element(by.css('div[ng-click="mediaPlayer.playPause()"]')).click(); 

    // for some reason these were needed for me; maybe it's the way the directive is implemented? 
    browser.waitForAngular(); 
    browser.waitForAngular(); 
    browser.waitForAngular(); 

    // make sure it's playing 
    expect(isPaused()).toBe(false); 

    // pause 
    element(by.css('div[ng-click="mediaPlayer.playPause()"]')).click(); 

    // make sure it's paused 
    expect(isPaused()).toBe(true); 
    }); 
}); 

Кроме того, вы можете использовать чужое директиву, как этот сайт (или любой другой) и не беспокоиться о юнит-тестирования (они предположительно сделали это для вас), и просто оценить возможности для их объекта и сделать убедитесь, что вы правильно настроили свои свойства в тестах E2E и даже не проверяете звук, если вам не нравится executeScript.

+1

Должен быть слепой при поиске такого метода в документации самостоятельно! Спасибо :) – GillesC