Используя 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();
}
);
});
В вашем примере не удалось выполнить $ .mockjaxClear() перед обратными вызовами и тем самым разрушить макет? –
@PatrickSzalapski Да, вы абсолютно правы. Я обновил свой код и поместил вызов '$ .mockjaxClear()' в 'teardown' модуля. Это фактически выполняется после теста. В обновленном jsFiddle я смоделировал описанный вами случай (с помощью 'setTimeout()' для отсрочки вызова). – Odi