2013-08-15 6 views
1

У меня есть метод handleDownload, который запускает загрузку файла. Функция отправляется на бэкэнд, который возвращает ответ, основываясь на том, что новый запрос отправляется на сервер, на котором находятся файлы. Я видел, что я могу использовать mockjax для издевательства над запросами, но как обращаться с разными путями, такими как успех, ошибка и т. Д. Как узнать, какой ответ вызывает триггер, путь (успех, ошибка, полный, ...). Что было бы отличным началом тестирования функции handleDownload и как? Для насмешек я использую Sinon.js У меня пока нет глубокого понимания. Я также должен проверить, вызвана ли функция handleDownloadFinal.Как написать модульный тест для встраивания аякс-запросов?

handleDownload: function(data, url) { 
$.ajax({ 
    type: "POST", 
    url: url, 
    data: {}, 
    success: function(response) { 
     if (response.success) { 
      var start_token = response.token; 
      $.ajax({ 
       type: start_token.method, 
       url: start_token.url, 
       beforeSend: function(xhr) { 
        xhr.setRequestHeader('Authorization', start_token.header); 
       }, 
       success: function(start_response) { 
        handleDownloadFinal(start_response.status_token); 
       }, 
       error: function(start_response) { 
        $.ajax({ 
         type: "POST", 
         url: url + 'proxy/', 
         success: function(fallback_response) { 
          if (fallback_response.success) { 
           handleDownloadFinal(fallback_response.status_token, true, fallback_response.job_uuid); 
          } else { 
           errorDownload(response.error); 
          } 
         }, 
         error: function(fallback_response) { 
          // Now this is some real error          
          generalErrorDownload(); 
         }, 
         dataType: 'json' 
        }); 
       }, 
       dataType: 'json', 
       xhrFields: { 
        withCredentials: true 
       } 
      }); 
     } else { 
      errorDownload(response.error); 
     } 
    }, 
    error: function(response) { 
     generalErrorDownload(); 
    }, 
    complete: function() { 
    }, 
    dataType: "json" 
}); 

} 

ответ

2

Вы должны использовать fake server приходя с Синоном.

before(function(){ 
    //create the server 
    this.server = sinon.fakeServer.create(); 
    // let the server automatically respond for every request 
    server.autoRespond = true; 
}) 

it('test something', function(){ 

    //let the server respond for specific url with 200-ok 
    this.server.respondWith("POST", "/some/article/comments.json", [200, { 
     "Content-Type": "application/json" 
    }, '[{ "id": 12, "comment": "Hey there" }]']); 
}) 

Как у вас есть куча запросов, и вы должны проверить все комбинации, я хотел бы предложить, чтобы иметь вспомогательную функцию для каждого запроса обязательно успех, чтобы вы могли проверить случаи, как это:

function letFirstRequestSucceed() { 
    this.server.respondWith("POST", "urlForFirstRequest", [200, { 
    "Content-Type": "application/json" 
    }, '[{ "id": 12, "comment": "Hey there" }]']); 
} 


function letSecondRequestFail() { 
    this.server.respondWith("POST", "urlForSecondRequest", [404, { 
    "Content-Type": "application/json" 
    }, '{error: "some error message"}'); 
} 


function letThirdRequestFail() { 
    this.server.respondWith("POST", "urlForThirdRequest", [404, { 
    "Content-Type": "application/json" 
    }, '{error: "some error message"}'); 
} 

it("should to something when the second and third request fails", function() { 
    sinon.spy(window, 'generalErrorDownload'); 
    letFirstRequestSucceed(); 
    letSecondRequestFail(); 
    letThirdRequestFail(); 

    handleDownload('someDate', 'aUrl'); 

    expect(generalErrorDownload) 

}) 

Btw вы должны подумать о том, чтобы реорганизовать код, используя jquerys deferred, который поддерживается вызовами api ajax, что сделало бы вашу запись намного более удобочитаемой.

+0

Когда я высмеиваю вещи и использую fakeServer, все будет действовать синхронно, не так ли? – boli

+0

Да, поддельный сервер немедленно вызовет сообщение об ошибке/ошибке. –

+0

Вы должны вызвать 'server.respond()', чтобы сообщить серверу вернуться из запросов AJAX, как правило, перед выполнением утверждений теста. Вы можете включить синхронный режим с 'server.autoRespond = true', хотя я его не пробовал. –

Смежные вопросы