2015-01-08 4 views
1

아약스 호출을 테스트하려고합니다. 올바른 데이터와 결과로 올바른 URL이 호출되는지 테스트해야합니다. 실패한이 테스트로 시작합니다. 내가 얻는 오류는 "예상 : 저장 됨, 실제 :"입니다. 내 녹아웃 뷰 모델에qunit 및 mockjax로 ajax 테스트 테스트

기능 -

self.functions.save = function() { 
    $.ajax({ 
     url: '/x', 
     data: { test: "" }, 
     dataType: "json", 
     success: function (response) { 
      self.saved(response.message); 
     } 
    }); 
}; 

Qunit 테스트 -

test('save does ajax call', function() { 
     $.mockjax({ 
      url: '/x', 
      dataType: 'json', 
      responseText: 
       { 
        message: 'saved' 
       } 
     }); 
     mock.functions.save(); 
     equal(mock.saved(), "saved"); 
}); 
+0

당신은 당신의 mockajax가 제대로 구성되었는지 확인하려면 성공 콜백에서'을 console.log (응답)'문을 넣어해야하며, 예상 반환 응답 ... – nemesv

답변

2

여기서 문제는 실행의 순서입니다. save() 메서드는 비동기 작업을 수행하며 Mockjax는이를 존중합니다. 따라서 테스트에서 mock.functions.save();을 호출하면 해당 함수 이 즉시을 반환합니다. 이는 equal() 어설 션이 소스 코드에서 ajax 호출의 success 핸들러보다 먼저 발생 함을 의미합니다. 테스트가 Ajax 호출이 완료된 시점을 알 수있는 방법을 추가해야합니다. 아래 예제에서는 간단한 콜백을 사용했지만 Promises 또는 다른 방법을 사용하여이 작업을 수행 할 수도 있습니다.

소스 코드 : 테스트에서

self.functions.save = function (callback) { 
    callback = callback || function(){}; // ensure we have a callback 
    $.ajax({ 
     url: '/x', 
     data: { test: "" }, 
     dataType: "json", 
     success: function (response) { 
      self.saved(response.message); 
     }, 
     // when the call is finished, execute the callback (success or error) 
     complete: function() { 
      callback(); 
     } 
    }); 
}; 

, 당신은 QUnit의 비동기 기능을 사용해야합니다. 거기에 new way to do async testing in v1.16.0, 그래서 중 하나를 업데이트하거나 the old way를 찾아 볼 수 있습니다 :

QUnit.test('save does ajax call', function (assert) { 
    // first tell QUnit you need to perform async actions... 
    var done = QUnit.async(); 

    $.mockjax({ 
     url: '/x', 
     dataType: 'json', 
     responseText: 
      { 
       message: 'saved' 
      } 
    }); 
    mock.functions.save(function() { 
     // this callback fires when the async action is complete, 
     // so now we do our assertions 
     assert.equal(mock.saved(), "saved"); 

     // ...and now we tell QUnit we're done with async actions 
     done(); 
    }); 
}); 
+0

테스트를 위해 코드 기반에 추가 코드를 삽입하는 방식이 잘못되었습니다. –

+0

나는이 문제를 이해하지 못한다고 생각합니다. 이것은 소스에 임의의 추가 코드 행을 가져 오지 않고 비동기 액션이 완료되었음을 호출 코드에 알리는 콜백 함수를 도입합니다. 이 옵션이 없으면 임의의 시간 초과를 설정하지 않는 한이 방법을 테스트 할 수 없습니다. 즉, 코드는 "테스트를 위해"추가되지 않으며 소스에서 적절한 비동기 코딩 스타일을 위해 추가되어 테스트를 용이하게합니다. – jakerella

+0

당신이 좀 더 강한 논쟁을하지 않는다면 나는 문제를 이해한다고 생각합니다. 나는 코드 -베이스가 테스트가 아닌 콜백없이 행복하게 떠날 수 있지만 그것이 임의의 코드라고 결코 말하지 않았다. 그러나 나는 그 순간에 다른 해결책을 모르고있다. –