Я борется с модульным тестом на 2 дня, и я не могу добиться такого результата в асинхронном тесте. Я новичок в модульном тестировании, и я не понимаю, почему это не работает.Как модулировать функцию javascript, которая вызывает getJSON
У меня есть файл login.js, который вызывает $ .getJSON (url, data, function) и возвращает строку со статусом входа («успех» или «сбой»). В вызове $ .getJSON используется mockjax для получения данных (он обертывает вызов ajax).
Функция входа в систему работает нормально при вызове с тестовой веб-страницы с использованием события jQuery click. Но теперь я пытаюсь запустить беззвучный тест с помощью Qunit и PhantomJS.
Похоже, проблема в том, что тест не ждет вызова $ .getJSON для получения результата (даже при использовании таймаута). Любые подсказки? Вот код.
login.js
var login = function(user, pass){
$.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
if(response.status === "success"){
//do something
return "success";
}
else{
//do something else
return "fail";
}
});
};
test.js
test("Test login", function(){
var user = "user1", pass = "pass1";
var done = assert.async();
var result = login(user, pass);
setTimeout(function(){
assert.equal(result, "success", "expect login succeded");
done();
},1000);
});
В тестовом результате я получаю:
Ожидаемый: "Успех"
Результат: не определено
Ваш 'Функция login' не возвращает ничего. Так что это нормально, что 'result' всегда будет неопределенным. Все, что вы делаете внутри своей функции входа в систему, - это вызов '$ .getJSON', но вы не возвращаете никакого результата. Внутри обратного вызова успеха вы пытаетесь вернуть какой-то результат, но, очевидно, это не так много, потому что никто не читает этот результат. –
Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –