2014-01-24 3 views
7

단위 테스트를 작성하려고하는 원격 API에 게시를 수행하는 JavaScript 함수가 있습니다. QUnit, Sinon.js - 가짜 서버에 정확한 요청 본문이 있는지 확인하려면 어떻게합니까?

var functionToTest = function(callback, fail) { 
    $.ajax({ 
     url: "/myapi/", 
     type: "POST", 
     data: { one: 'one', two: 'two' }, 
     accept: "application/json", 
     contentType: "application/json" 
    }).done(function(x) { 
     log = generateLogMessage('Success'); 
     callback(log); 
    }).fail(function(x, s, e) { 
     log = generateLogMessage('Fail'); 
     fail(log); 
    }); 
} 

내가 (Sinon.js을 활용 QUnit에서) 단위 테스트를 요청이 성공 올바르게 때 콜백이 호출됩니다 테스트가 :

QUnit.test('Test that the thing works', function() { 

    var server = this.sandbox.useFakeServer(); 

    server.respondWith(
     'POST', 
     '/myapi/', 
     [ 
      200, 
      {'Content-Type': 'application/json'}, 
      '{"Success":true}' 
     ] 
    ); 

    var callback = this.spy(); 
    functionToTest(callback, callback); 
    server.respond(); 

    QUnit.ok(callback.calledWith(generateLogMessage('Success'))); 
}); 

이를 내가 테스트 할 방법은 이것이다 테스트가 작동하지만 요청 본문에 관계없이 성공적으로 반환됩니다. 내가 원하는 것은 가짜 서버가 요청 본문 인 경우에 만 응답하는 것입니다. { one: 'one', two: 'two' }

답변

3

나는 filtered requests을 사용할 것을 제안 할 것입니다. 그러나 이것은 현재의 sinon 구현에서는 불가능합니다. 문서에서

발췌 :

이 있는지 여부 가짜 요청에 결정하는 필터를 추가합니다. 필터는 xhr.open이 호출 될 때 인수 (메서드, url, async, username, password)와 완전히 동일하게 호출 될 때 호출됩니다. 필터 이 truey를 반환하면 요청이 위조되지 않습니다.

데이터를 필터링 할 수있는 능력이 없습니다.

편집 : 나는 문제를 정확하게 이해한다면, 당신은 다음과 같이 할 수 있습니다 : 그 코드가 원하는 정확한 결과를 얻을 수 알고

functionToTest(...); 
var request = server.requests[0]; 
var data = JSON.parse(request.requestBody); 
if (data.one == 'one' && data.two == 'two') { 
    request.respond(200, jsonHeaders, JSON.stringify(specialResponse)); 
} 
else { 
    request.respond(200, jsonHeaders, JSON.stringify(otherResponse)); 
} 

,하지만 방법이 프로그래밍을에이 아니다 지금은 죄수들과 함께 그것을 달성하십시오.

+0

감사합니다. 나는 지금 내가하고있는 일을 계속할 것입니다. – BeardedCoder

10

거의 2 년 후에 지금, 여전히 중요한 :

server.respondWith에 세번째 파라미터로 배열 대신 전달 함수에 의해 달성 될 수있다. 이 함수는 호출 할 수있는 하나의 인수 '요청'을받습니다. request.respond(statusCode, headers, body);

그래도 값은 request.requestBody에서 추출해야하지만 적어도 실행 가능합니다.

QUnit.test('Test that the thing works', function() { 

    var server = this.sandbox.useFakeServer(); 

    server.respondWith(
     'POST', 
     '/myapi/', 
     function (request) { 
      console.log(request.requestBody); // <- assert here :-) 
      request.respond(200, {'Content-Type': 'application/json'}, '{"Success":true}'); 
     } 
    ); 

    var callback = this.spy(); 
    functionToTest(callback, callback); 
    server.respond(); 

    QUnit.ok(callback.calledWith(generateLogMessage('Success'))); 
}); 
+0

좋은 생각, 고마워! – Johan

+0

xhr.respond의 코드 : https://github.com/sinonjs/sinon/blob/fd56d7f0c2c749e21475a630bee99ffdbc090516/lib/sinon/util/fake_xdomain_request.js#L150 – luqmaan

+0

이것은 실제 답변이어야합니다. – jesantana