2014-09-09 18 views
9

Próbowałem ukryć tag <audio> za pomocą testów automatycznych, aby rozpocząć, aby potwierdzić, że gra.Jak przetestować dźwięk?

Używam zwykłego zestawu testów kątowych, karmy i kątomierza.

"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" 
} 

Na stronie Karma kwestia jest taka, że ​​nie mógł znaleźć sposobu dodawania zasobów do potencjalnie wykorzystać w testach więc nie ma pliku do odtwarzania w środku. Jeśli istnieje sposób na wskazanie pliku do odtworzenia, nie powinno to być problemem, ponieważ mógłbym po prostu sprawdzić właściwość elementu w postaci paused.

Po stronie 2e2 rzeczy znajduje się aplikacja demo, która działa doskonale, test może załadować ją w porządku, a kliknięcie jednego przycisku nie generuje żadnych błędów (uruchamia dźwięk, jeśli spróbujesz go ręcznie). Jednak patrząc na API kątomierza, nie mogłem znaleźć niczego, co pozwoliłoby mi upewnić się, że dźwięk rzeczywiście gra, lub pozwala mi uzyskać dostęp do elementu, ponieważ nawet document i angular nie są dostępne tutaj (co ma sens jako test 2e2) lub po prostu API do sprawdzania właściwości elementu.

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

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

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

    // what to do? 

}); 

myślałem o możliwie szyderczy API dźwięku i po prostu fałszywe właściwości aktualizowany ale ja wciąż testuje przeciwko mojego kodu i currentTime byłoby bardzo trudne do makiety dokładnie kiedy mój koniec celem jest przetestowanie dźwięk w spriterze dźwiękowym zaczyna się i kończy w oczekiwanym momencie.

Idealnie chciałbym to uwzględnić w testach jednostkowych, gdzie powinno być, więc możliwość wykorzystania zasobów roboczych byłaby idealna. Aby prosty expect(!element[0].paused).toEqual(true); wystarczy wiedzieć, że gra.

Jak mogę podać plik w testach jednostkowych, aby można go było wykorzystać jako źródło dźwięku?

+0

Czy sprawdzenie znacznika audio ma wartość 0:00 wystarczającą? –

+0

W przypadku, gdy możesz odtwarzać plik, wtedy 'paused' powinno wystarczyć i tak sprawdzanie' currentTime' nie jest '0' też by działało, ale problemem jest to, że w testach nie ma pliku do odtworzenia (can ' • znaleźć sposób, aby mu służyć), aby te właściwości nigdy się nie zmieniły. – GillesC

+0

ah sorry miss rozumiem, będę musiał pomyśleć przepraszam –

Odpowiedz

12

Zakładając, że odtwarzasz dźwięk za pomocą HTML5 <audio /> pod maską, możesz wykonać następujące czynności: po prostu użyj browser.executeScript, aby uzyskać dostęp do pause, tak jak chciałeś. Musisz mieć sposób na przejście do tagu <audio />; w tym przypadku był to pierwszy. Działa to w mojej piaskownicy. Uwaga: nie jestem związany z odtwarzaczem mediów kątowych - to był tylko pierwszy wynik w Google, dzięki któremu mogłem pracować z kątomierzem - używam go ponownie, kiedy tylko mogę.

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); 
    }); 
}); 

Również można użyć cudzego dyrektywę jak tej strony (lub jakiegokolwiek innego) i nie martwić się o jednostkowej testów (oni przypuszczalnie zrobić to dla ciebie) i po prostu ocenić zakres ich przedmiotu i dokonać upewnij się, że poprawnie ustawiasz jego właściwości w testach E2E, a nawet nie testujesz dźwięku, jeśli nie podoba ci się executeScript.

+1

Musiałam być ślepa, gdy sama szukałam takiej metody w dokumentacji! Dziękuję Ci :) – GillesC