2010-02-16 5 views
8

내 JavaScript 코드에는 다음과 같은 코드가 있습니다.JavaScript 모의 방법을 확인하는 방법

if (window.confirm('Are you sure?')) { 
    AdminData.actOnResult('delete'); 
} 

나는이 코드 조각에 대한 테스트를 쓰고 있어요. 어떻게 window.confirm 메서드를 조롱합니까? 다음 코드를 시도했지만 작동하지 않습니다.

window.confirm = function(arg) { 
    return true; 
}; 

I는 다른 함수로 window.confirm 방법 이동할 수 그리고 그 방법을 모방 할 수있다. 그러나 더 나은 솔루션이 있는지 궁금합니다.

답변

1

IE에서 내 자신의 코드가 제대로 작동합니다. 그냥 전역 범위에 다음를 오버라이드 (override) :

var confirm = function() { return true; } 

편집
내가 과거에 SO에 대한 몇 가지 질문을 본 적이 confirm을 무시하려고에 대해, 그들이 좋아하지 않아 주로하기 때문에 그것 (그리고 누가?). 이런 종류의 이유로 이것을 우회하는 경우 코드를 변경하여 확인을 위해 콜백 기반 대체를 구현하는 것이 좋습니다. 이 좋은 예를 보려면 jQuery UI's modal confirm을보십시오.

1

저는 윈도우 (또는 다른) 객체에 정적 메소드를 래퍼로 구현하는 방법에 대해 생각해 보겠습니다. 그런 다음 정적 메서드를 사용하는 모든 것에 래퍼를 제공하십시오. 분명히 "클래스"기반 구현을 사용하는 경우이 방법이 더 쉽습니다. 그런 다음 메서드를 조롱하려면 원하는 값을 반환하는 다른 래퍼를 제공하면됩니다.

var windowWrapper = { 
    confirm: function(msg) { return confirm(msg); }, 
    ... 
}; 

var mockWrapper = { 
    confirm: function(msg) { return true; }, 
    ... 
} 

var wrapper = windowWrapper; 
if (test) { 
    wrapper = mockWrapper; 
} 

...

if (wrapper.confirm('Are you sure?')) { 
    AdminData.actOnResult('delete'); 
} 
3

그때 내가 말할 수있는 단위 테스트를 위해 재스민을 이용하고 있고 경고 조롱 다음과 같은

alert = function (alertString) {debug.log('ALERT:', alertString);}; 

var confirmValue = true; //set this before you expect the confirm statement to be shown 
confirm = function (confirmString) { 
    debug.log('CONFIRM:', confirmString, confirmValue); 
    return confirmValue; 
}; 

로 확인했다 :

describe("test", function() { 
    it('should test true confirm workflow', function() { 
     confirmValue = true; // or false if you like 
     //expect outcomes that would come from any confirms being called with true 
    }); 
}); 

완벽하지는 않습니다. 당신은 confirmValue를 설정하는 사이에 갑자기 나타날 수있는 여러 가지 확인 사항이 있습니다. 문제가있을 수 있습니다. 아마 그때 예상되는 확인 반환 값의 신호를 설정하는 것이 좋을 것입니다 ... 까다로운 ...

+0

지금까지 3 답변의 IMO,이 하나는 닉이 요구하는 것을 해결합니다. 당신의 대답 외에도 Javascript의 정적 조롱에 대해서는 Stackoverflow에 거의 없습니다. –

관련 문제