2015-03-03 1 views
2

Я борется с модульным тестом на 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); 
}); 

В тестовом результате я получаю:

Ожидаемый: "Успех"

Результат: не определено

+1

Ваш 'Функция login' не возвращает ничего. Так что это нормально, что 'result' всегда будет неопределенным. Все, что вы делаете внутри своей функции входа в систему, - это вызов '$ .getJSON', но вы не возвращаете никакого результата. Внутри обратного вызова успеха вы пытаетесь вернуть какой-то результат, но, очевидно, это не так много, потому что никто не читает этот результат. –

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call) –

ответ

1

Ваш login Функция должна быть асинхронной, потому что ее результат зависит от ответа от сервера.

Итак, давайте перепишем функцию следующим образом:

function login(user, pass, done) { 
    $.getJSON(..., function (res) { 
     done(res.status == 'success') 
    }) 
} 

Затем вы можете проверить, как этот (предполагается, что мокко):

describe('...', function() { 
    it('login()', function (done) { 
     login('user', 'pw', function (isLoggedIn) { 
      assert(isLoggedIn) 
      done() 
     }) 
    }) 
}) 
+0

Привет @ Аянами! Спасибо за ваш быстрый ответ. Я не понял, как работает этот вызов done (res.status == 'success') А затем на test.js, что такое isLoggedIn? Извините, но я не понял, как проверить это на qunit:/ –

+1

Я сам это осознал, спасибо за вашу помощь снова. –

0

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

login.js

var login = function(form, cb){ 
    $.getJSON("loginURL", {"user":user, "pass":pass}, function(response){ 
     if(response.status === "success"){ 
      //do something 
     } 
     else{ 
      //do something else 
     } 
     cb(response.status); 
    }); 
}; 

test.js (QUnit)

test("Testing login", function(assert) { 
    var done = assert.async(); 
    var cb = function(param){ 
       assert.equal(param,"success", "Expect getJSON/login to success"); 
       done(); 
      }; 
    login(user, pass,cb); 
}); 

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

  • Нет связанных вопросов^_^