2009-12-21 6 views
3

document.ready 내에서 ExternalFunction 내부 코드를 단위 테스트 할 수 있는지 여부를 묻는 것이 좋습니다. 나는 잠시 동안 많은 일을 시도해 왔지만 아직도 어떻게 일할 수 없었으며, 나의 재치가 끝났습니다.함수 내에 정의 된 단위 테스트 javascript 함수에 어쨌든 있습니까?

$(document).ready(function() { 
    var originalExternalFunction = ExternalFunction; 
    ExternalFunction = function(context, param) { 
     // trying to unit test the stuff in here! 
    } 
} 

저는 JsTestDriver를 사용하여 단위 테스트를하고 있습니다. 테스트 선언은 TestThisTest.prototype.test_this와 유사합니다. function() {};

미리 감사드립니다. 그 다음은 newExternalFunction에 단위 테스트를 실행하는 데 비교적 간단합니다

function newExternalFunction(context, param) { 
    //etc. 
} 

$(document).ready(function() { 
    var originalExternalFunction = ExternalFunction; 
    ExternalFunction = newExternalFunction; 
} 

:

+0

코드는 그것을 재정의 한 후'ExternalFunction'의 값을 잡는 될 것으로 보인다. 그게 정말로 당신이하고 싶은 뜻인가요? –

+0

@TJ 이것은 동적 언어로 전역 함수를 연결하는 표준 방법입니다. – FryGuy

답변

1

당신이 뭔가를 할 수 있습니다.

말했다되고 그건
ExternalFunction = function() { } 
ExecuteDocumentReady(); // implement a mock on $(document).ready(fn) to store the function, and then execute it here 

ExternalFunction(fakeContext, fakeParam); 
assert(fakeContext.foo == 12); // or whatever you need it to do 

, 내가 자바 스크립트에서 그렇게하는 방법을 정확하게 확실하지 않다 :

0

이론적으로, 당신은 뭔가를 할 수 있습니다.

2

예제에서 ExternalFunction은 함수 범위 내에서 선언되지 않았으므로 전역 적이기 때문에 (또는 최소한 ready 외부에 정의 된 범위 내에서) 선언해야합니다. 따라서이를 전역으로 호출하여 테스트 할 수 있습니다.

문제는 ExternalFunction에 기능을 할당하려면 ready (필요한 경우 수동으로 실행할 수 있음)을 실행해야합니다. 즉, ready에 다른 기능을 넣으면 아니오, 단위 테스트 할 수 없습니다. 귀하의 예제 코드가 현실의 정확한 반영이라면, 나는 그것이 다소 시험 가능하다고 생각한다.

이와 같은 구조의 핵심은 내부 기능을 숨기는 것입니다. 숨기고 싶지 않다면 Anon.의 접근성이 더 좋은 범위에 newExternalFunction을 정의하는 제안이 필요합니다.

var newExternalFunction; 
    $(document).ready(function() { 
     var originalExternalFunction = ExternalFunction; 
     newExternalFunction = function(context, param) { 
      // trying to unit test the stuff in here! 
     } 
     ExternalFunction = newExternalFunction; 
    } 

당신은 여전히 ​​ready 전에 단위 테스트를 실행되었는지 확인해야합니다,하지만 당신 같으면 : 함수가 ready 내에서 변수를 사용하여 폐쇄 할 필요가있는 경우

, 당신은 이렇게 newExternalFunction을 정의 할 수 있습니다 ExternalFunctionoriginalExternalFunction으로 재설정되지 않아야합니다.

+0

@Paul : 답변 해 주셔서 감사합니다. ExternalFunction은 사실 SharePoint 함수의 별칭이므로 호출 할 수는 없습니다. 나는 document.ready를 호출하기 전에 dummy ExternalFunction을 설정해야한다고 생각하고 상상할 수있는 모든 방법을 시도했지만 아무 것도 효과가 없었습니다. 그런 종류의 설정이 Java 내부 변수와 비슷하다고 생각했기 때문에 재정의 된 ExternalFunction을 직접 호출 할 필요없이 테스트하기가 매우 어렵습니다. ExternalFunction의 마지막 코드 줄에서 originalExternalFunction이 적절한 매개 변수로 호출되기 때문에 ExternalFunction을 분할 할 수 없습니다. – BeraCim

0

당신은 당신의 콜백 함수를 생성하기 위해 클로저를 사용할 수 있습니다

// create function to make your "extension" function 
function createHookFunction(callback) { 
    // return a function 
    return function(context, param) { 
    var ret; 
    // // trying to unit test the stuff in here! 


    if (typeof callback == 'function') { 
     // if you want to trap the return value from callback, 
     // ret = callback.apply(...); 
     callback.apply(this, arguments); 
    } 
    return ret; 
    }; 
} 

// your hook now becomes: 
$(document).ready(function() { 
    ExternalFunction = createHookFunction(ExternalFunction); 
}); 

// and your unit test becomes: 
var funcToTest = createHookFunction(); 
funcToTest(testContext, testParam); 

// And, you could even test that the callback itself gets called 

function someTest() { 
    var testContext = {}, testParam='test'; 
    var callbackCalled = false; 
    var funcToTest = createHookFunction(function(context, param) { 
    callbackCalled = (context === testContext) && (param === testParam); 
    }); 
    return (funcToTest(testContext, testParam) == 'Expected Return') && callbackCalled; 
} 
+0

@gnarf : 답변 해 주셔서 감사합니다. // 여기에 물건을 단위 테스트하려고한다면! ... 주석 블록의 끝에는 originalExternalFunction에 대한 호출이 있습니까? 그것을 단위 테스트 할 수 있습니까? 더 중요한 것은 기존 코드를 수정하지 않고 코드를 단위 테스트 할 수 있습니까? 감사. – BeraCim

+0

함수 클로저가 작동하는 방식을 자세히 살펴보면'originalExternalFunction'을'callback'으로 전달합니다. 원래 함수에 대한 "call"을 함수 자체에서 분리 할 수 ​​있습니다. 그 기능은'originalExternalFunction'의 기능과 더 이상 연계되어 있지 않기 때문에 기능을 테스트 할 수 있습니다. 그것은 신속하게 잘라내어 붙여 넣기 작업이어야합니다 ('originalExternalFunction'에 대한 호출을 제거하십시오.). 원래의 질문으로 함수의 코드를 편집하려면 좀 더 구체적인 예를 보여줄 수 있습니다. – gnarf

관련 문제