2012-11-20 6 views
6

은 브라우저에서 파일 선택 도구을 전세계로 조롱하는 방법에 관심이 있습니다. 특히, 나는 에서 파이어 폭스에서 가장 관심이 있지만 일반적인 해결책을 선호합니다.단위 테스트를 위해 브라우저에서 파일 선택 도구를 어떻게 조롱합니까?

파일 선택 대화 상자가 나타나지 않도록주의해야합니다. 나는 그것이 열렸다는 것을 주장 할 필요가 없다. 문제는 파일 선택기를 여는 JavaScript 코드에 대한 단위 테스트가 있다는 것입니다. 대화 상자가 열리면 은 테스트 모음의 실행을 중지합니다.

예를 들어 방법을 Backbone.View으로 테스트하고 있습니다. 이 메서드는 렌더링 될 때 파일 선택기를 열 수있는 하위 뷰를 렌더링합니다. 그 서브 뷰를 직접 테스트하지 않기 때문에, onRender 메소드의 다른 부분을 테스트하는 데에만 관심이있을 때 그 동작의 일부를 조롱하지 않는 것이 좋습니다.

예 :

//Test file 
it("should do something", function() { 
    var view = new App.Views.SomeView(); 
    spyOn(view.modelBinder, "bind"); 
    view.render(); 
    expect(view.modelBinder.bind).toHaveBeenCalled(); 
}); 

//View file 
onRender : function() { 
    this.modelBinder.bind(this.el, this.model); 
    this.$("#thing").html(this.subview.render().el); //This line has a side effect that opens file picker 
} 

는 기본적으로 내가 명시 적으로 내가 여기 테스트에 관심이 무엇을하지 않기 때문에 파일 선택기가 열리도록 행동을 조롱하고 싶지 않아요. 이렇게하면 테스트 스위트가 훨씬 더 부서지기 쉽고 유지 관리가 어려워집니다.

+0

js-test-driver를 사용하고 있습니까? – leeand00

+0

부탁을하고 단위 테스트를 추가하고 그것을 표시하는 함수가 호출되는 행을 주석 처리하십시오. – leeand00

+0

몇 가지 코드와 상황에 대한 설명을 추가했습니다. –

답변

0

sinon을 사용하여 통화를 가짜/스파이/스텁 아웃합니다. 실제로 전화를 걸지 않고 전화를 테스트 할 수 있습니다.

그런 식으로 대화 상자를 표시하는 실제 함수를 호출하지 않고 함수가 호출되었음을 테스트 할 수 있습니다.

+0

파일 선택 도구가 열리는 원인이 스위트마다 다르므로이 작업을 수행하지 않는 것이 좋습니다. 차라리 피커가 열리는 것을 전 세계적으로 방지 할 수 있습니다. –

+0

파일 선택기가 열리는 특정 메서드/이벤트를 스텁 (stub)하지 않으려는 이유에 대해 위의 설명을 추가했습니다. –

+0

@AndrewHubbs 단원 테스트가 작성중인 API 이외의 API에 의존하는 경우 단위 테스트를 잘못 수행하면 단위 테스트 대신 통합 테스트가됩니다. – leeand00

0

질문에 대답 하시려면 : 그냥하지 마세요.

원하지 않는 부작용을 피하기 위해 subview.render()을 빈 기능으로 바꿉니다. 당신은 그러나 말 :

는 "이 이기 때문에 명시 적으로 파일 선택기이 열리도록 동작에서을 조롱하지 않으 하지 내가 뭘 ... 테스트에 관심"

약간 모순입니다. 단위 테스트 App.Views.SomeView을 원할 경우 은 외부 협력자를 조롱해야합니다. 특히 재미있을 때는이고 파일 선택기는 포함해야합니다. 반면에 단위 테스트를 수행 할 때는 SUT을 사용하지 마십시오.

비웃음 사실 빨간색으로 경향이 테스트는 더 만들지 만, 생산 코드가 병이 커플 링의 형태 (IMHO, Backbone.js 애플 리케이션의 자주 함정으로 고생하지 않도록하는 유일한 방법입니다 것입니다.)

파일 선택기를 표시하지 않도록해야하는 유일한 장소는 파일 선택기 자체를 단위 테스트 할 때입니다.이 경우 파일 시스템 선택기로 sinon을 사용할 수 있으며 그렇지 않은 경우에는 적용 범위를 벗어날 수 있습니다. jQuery 사용하기. "자신이 소유하지 않은 유형을 조롱하지 말것"을 기억하십시오 규칙.

관련 문제