2017-02-16 1 views
0

sinonjs를 사용하여 내 ajax 응용 프로그램을 테스트하고 있습니다.sinon stub yields를 호출하는 방법 인수에 따라 함수

sinon.stub($, 'ajax').yieldsTo('success', 
{ 
    msgtype: 'success', 
    state: 'loggedin' 
}); 

내 문제는 : AJAX의 URL을 기반으로 다르게 인수를 보내려고합니다. 어떻게하면 될까요? $ 아약스에 URL이

:

은 $ 아약스에 URL이 : /getemail는 '성공'에 대한 인수는 {해야한다 : /login는 '성공'에 대한 인수는 { 'loggedin'상태}해야한다 이메일 : '[email protected]'}

------------ 편집 --------------

내 아약스 인수는 {url : '/ 로그인', 유형 : 'POST', 데이터 : 요청 _ 데이터, 성공 : 기능 (데이터) {}}

ajaxStub.withArgs({url:'/login'})이 작동하지 않습니다.

답변

2

Sinon 스터브는 stub.withArgs(arg1[, arg2, ...]) 메서드를 사용하여 동일한 함수에 대해 서로 다른 입력 매개 변수로 다른 동작을 지정할 수 있습니다. $.ajax 첫 번째 매개 변수는 URL이기 때문에, 다음과 같은 작업을 수행 할 수 있습니다

const ajaxStub = sinon.stub($, 'ajax'); 
ajaxStub.withArgs('/login').yieldsTo('success', { state: 'loggedin' }); 
ajaxStub.withArgs('/getemail').yieldsTo('success', { email: '[email protected]' }); 

편집

을 당신이 아마와 쉽게 달성 할 수없는 유일한 매개 변수로 객체를 전달하고 있기 때문에 withArgs() 또는 불가능 . 이 문제를 해결하는 가장 쉬운 방법은 $.ajax 대신 사용되는 사용자 지정 함수를 정의하는 것입니다. 다행히도 JavaScript에서는 매우 간단하고 sinon은 대체 함수를 sinon.stub(object, 'method', replaceFunc)의 세 번째 매개 변수로 제공 할 수 있습니다.

function fakeAjax(obj) { 
    if (obj.url === '/login') { 
    return obj.success({ state: 'loggedin' }); 
    } 
    if (obj.url === '/getemail') { 
    return obj.success({ email: '[email protected]' }); 
    } 
} 

sinon.stub($, 'ajax', fakeAjax); 

인수가 조건과 일치 할 때 올바른 콜백을 호출했는지 확인하십시오. 이 메소드를 사용하면 더 구체적으로 만들 수도 있습니다. 예를 들어 실제로 POST 요청인지 확인할 수도 있습니다.

+0

, 당신은 http://stackoverflow.com/users/6447491/michael-jungo – Codeanu

+0

을 확인하십시오 수 있습니다 나는'에 그냥 객체를 제공하는 경우에 대한 답을 갱신 $ .ajax'. –

+0

당신은 내 하루 마이클을 만들었습니다, 고마워요. – Codeanu

1

withArgssinon.match과 함께 사용할 수 있습니다. 예를 들어 : 나는 질문을 편집 한

ajaxStub = sinon.stub(jQuery, 'ajax'); 
ajaxStub.withArgs(sinon.match({ url: 'https://some_url'})).yieldsToAsync('success', responseData);