Comment jouer à un son est-il en train de jouer?

J'ai essayé de couvrir la <audio> par des tests automatisés, pour commencer simplement pour confirmer qu'il joue.

J'utilise la suite de test angulaire habituelle, le karma et le rapporteur.

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

Sur le côté Karma, le problème est que je n'ai pas pu trouver un moyen d'ajouter des ressources à utiliser potentiellement dans les tests, donc aucun fichier à jouer ici. S'il y avait un moyen de pointer vers un fichier à jouer, il ne devrait pas y avoir de problème car je pourrais simplement vérifier la propriété en paused de l'élément.

Sur le côté 2e2, il existe une application de démonstration qui fonctionne parfaitement, le test peut le charger correctement et en cliquant sur l'un des boutons ne génère aucune erreur (il déclenche le son si vous l'essayez manuellement). Cependant, si je regardais l'API Protractor, je ne trouvais rien qui puisse me permettre d'assurer le bon fonctionnement du son ou de me permettre d'accéder à l'élément car même les document et les angular ne sont pas disponibles ici (ce qui a un sens en tant que test 2e2) ou juste un API pour vérifier les propriétés de l'élément.

 beforeEach(function() { browser.get("index.html") }); it("Ensure the player is playing", function () { $$("button").first().click(); // what to do? }); 

J'ai pensé à se moquer de l'API audio et fausser les propriétés en cours de mise à jour, mais je suis toujours en train de tester mon code et l' currentTime serait très difficile à moquer avec précision quand mon but est de tester un son sur un sprite audio est Démarrage et arrêt lorsque prévu.

Idéalement, je veux couvrir cela dans les tests unitaires, où il devrait être, afin d'être capable d'utiliser une ressource de travail serait idéal. Pour que l'on expect(!element[0].paused).toEqual(true); Suffira pour savoir que ça joue.

Comment puis-je servir un fichier dans mes tests d'unité pour être utilisé comme source audio?

En supposant que vous jouez au son à l'aide de HTML5 <audio /> sous le capot, vous pouvez effectuer les opérations suivantes: utilisez essentiellement browser.executeScript pour accéder à une pause comme vous le souhaitez. Vous devrez avoir un moyen de naviguer vers votre <audio /> ; Dans ce cas, c'était le premier. Cela fonctionne dans mon bac à sable. Remarque: Je ne suis pas affilié à un lecteur de médias angulaires – c'était juste le premier résultat sur Google que je pouvais travailler avec le rapporteur – je réutilise quand je peux.

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

Aussi, vous pouvez utiliser la directive de quelqu'un d'autre comme ce site Web (ou tout autre) et ne pas vous soucier des tests unitaires (ils ont probablement fait cela pour vous) et simplement évaluer la portée de leur objet et vous assurer de définir correctement leurs propriétés Dans vos tests E2E et même pas tester le son si vous n'aimez pas le executeScript .