2013-02-08 3 views
1

Используя Qunit и MockJax, я стараюсь провести два теста, упрощенных здесь для удобства понимания. Один из следующих двух тестов терпит неудачу, по-видимому, потому, что два теста проходят параллельно, и поэтому они не каждый получают свой собственный обход $.ajax(). (Единственное различие - ответное предложение в каждом.) Любые идеи о хорошем способе настройки, чтобы пройти оба теста?Mockjax дважды в одном тестовом файле?

function testAjax() { 
    return $.ajax({ 
     type: 'POST', 
     dataType: 'json', 
     url: '/fakeservice/1', 
     data: {'a':'b'} 
    }); 
} 

asyncTest("testAjax 1", function() { 
    $.mockjax({ 
     url: '/fakeservice/1', 
     type: 'POST', 
     dataType: 'json', 
     responseText: { 'name1': 'foo' } 
    }); 

    testAjax().then(
     function (response) { 
      deepEqual(response.name1, 'foo', "no name1"); 
      start(); 
     }, 
     function (error) { 
      ok(false, "got AJAX error"); 
      start(); 
     } 
    ); 
}); 


asyncTest("testAjax 2", function() { 
    $.mockjax({ 
     url: '/fakeservice/1', 
     type: 'POST', 
     dataType: 'json', 
     responseText: { 'name1': 'bar' } 
    }); 

    testAjax().then(
     function (response) { 
      deepEqual(response.name1, "bar", "no name1"); 
      start(); 
     }, 
     function (error) { 
      ok(false, "got AJAX error"); 
      start(); 
     } 
    ); 
}); 

ответ

3

Вы должны вызвать $.mockjaxClear() в конце каждого испытания (например, в teardown() методе модуля). Это разрушает макет и готовит среду для следующего теста.

function testAjax() { 
    return $.ajax({ 
     type: 'POST', 
     dataType: 'json', 
     url: '/fakeservice/1', 
     data: {'a':'b'} 
    }); 
} 

module("AJAX tests", { 
    teardown: function() { 
     $.mockjaxClear(); 
    } 
}); 
asyncTest("testAjax 1", function() { 
    $.mockjax({ 
     url: '/fakeservice/1', 
     type: 'POST', 
     dataType: 'json', 
     responseText: { 'name1': 'foo' } 
    }); 

    testAjax().then(
     function (response) { 
      deepEqual(response.name1, 'foo', "no name1"); 
      start(); 
     }, 
     function (error) { 
      ok(false, "got AJAX error"); 
      start(); 
     } 
    ); 
}); 


asyncTest("testAjax 2", function() { 
    $.mockjax({ 
     url: '/fakeservice/1', 
     type: 'POST', 
     dataType: 'json', 
     responseText: { 'name1': 'bar' } 
    }); 

    testAjax().then(
     function (response) { 
      deepEqual(response.name1, "bar", "no name1"); 
      start(); 
     }, 
     function (error) { 
      ok(false, "got AJAX error"); 
      start(); 
     } 
    ); 

}); 

См. your adapted example on jsFiddle.

+0

В вашем примере не удалось выполнить $ .mockjaxClear() перед обратными вызовами и тем самым разрушить макет? –

+0

@PatrickSzalapski Да, вы абсолютно правы. Я обновил свой код и поместил вызов '$ .mockjaxClear()' в 'teardown' модуля. Это фактически выполняется после теста. В обновленном jsFiddle я смоделировал описанный вами случай (с помощью 'setTimeout()' для отсрочки вызова). – Odi

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