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를 살펴보면 사운드가 실제로 재생되고 있는지 또는 심지어 documentangular (여기서는 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 시가되지 않았습니까? –

+0

파일을 재생할 수있는 경우'paused'가 충분해야하고'currentTime'이'0'도 아닌지 확인하는 것이 효과적 일 것입니다. 그러나 여기서 문제는 테스트에서 재생할 파일이 없습니다 (' 하나를 제공하는 방법을 찾지 못함) 그러한 속성은 절대로 바뀌지 않습니다. – GillesC

+0

아, 미안하다, 미안하다. –

답변

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

또한 당신은 단위 테스트에 대해 걱정할 (그들은 아마도 당신을 위해이 일을했습니다)와 그들의 개체의 범위를 평가하고 만들어 본 웹 사이트 (또는 다른)처럼 다른 사람의 지시를 사용 할 수 없습니다 executeScript이 마음에 들지 않으면 E2E 테스트에서 제대로 속성을 설정하고 소리를 테스트하지 않아도됩니다.

+1

문서에서 직접 이러한 메소드를 찾을 때 눈이 멀었 음에 틀림 없습니다! 고맙습니다 :) – GillesC

관련 문제