2012-07-03 5 views
1

Я использую поддельный сервер sinon js с Jasmine для UT/IT. Я установил server.autorespond = true. (проверяется даже после сокращения ms в server.autoRespondAfter)Использование автоответчика SINON JS

Проблема: Обратные вызовы не запускаются после ответа сервера на запросы (я могу проверить журналы запросов сервера и сам объект сервера, чтобы увидеть тексты ответов). Жасмин не выполняет проверку на успех или отказоустойчивость. CalledOnce.

Эта проблема не возникает, когда: я использовал server.respond() после установки server.respondWith (..) & мои обратные вызовы были вызваны должным образом после ответа сервера. Жасмин передает проверку на успех или неудачу callback.CalledOnce.

Мое понимание - автоответчик заставляет сервер отвечать автоматически, когда он получает асинхронные запросы и включает вызов соответствующих обратных вызовов? Должен ли я все еще использовать server.respond?

Спасибо.

фрагмент кода: прочтите требуемый файл json &, отправьте его как ответ сервера. Чтение json-файла - синхронный вызов (асинхронный).

this.server = sinon.fakeServer.create(); 
this.server.autoRespond = true; 
sinon.FakeXMLHttpRequest.useFilters = true; 

sinon.FakeXMLHttpRequest.addFilter(function (method, url, async, username, password) { 
    // Don't fake json file read requests 
    if (url == inputUrl) { 
    return true; 
    } 
}); 

this.resultfile = this.readJsonFile(inputUrl); 

this.server.respondWith("GET", endUrl, 
    [200, { "Content-Type": "application/json" }, this.resultfile]); 

console.log (this.server.requests); // Logs all requests so far 

В моей Жасмин спецификации у меня есть

var callbacks = [sinon.spy(),sinon.spy()]; 

// call the above sinon code and then make the test call below 

jQuery.ajax({ 
    url: '/abc', 
    success: callbacks[0] 
}); 

// this fails, though I can see the server responded to the request. 
expect(callbacks[0].calledOnce).toBeTruthy(); 
+0

работает отлично для меня ... отправьте код –

+0

@RobertLevy Спасибо за ответ. Я обновил Q кодом. – user1497630

ответ

0

jQuery.ajax является асинхронной ... ваш тест потерпит неудачу, если вы будете ждать достаточно долго, перед вызовом ожидать(). альтернативно, вы можете установить make .ajax synchronous, выполнив jQuery.ajax({ url: '/abc', async: false, success: callbacks[0] });, хотя это не будет работать для определенных типов запросов (например, перекрестный домен) ... подробнее см. в документах API jquery.

+0

Если я сделаю запрос синхронным, он пройдет. Но если у меня есть это как асинхронный вызов и вы используете waitsFor в жасмине, все равно это терпит неудачу. 'Ожидать (обратные вызовы [0] .calledOnce) .toBeTruthy(); -> false \t \t Ожидание (обратные вызовы [1] .calledOnce) .toBeFalsy(); -> true' Таким образом, никто из callback (успех или отказ) не вызван. – user1497630

+0

Прохождение через вызов sinon js вызывает следующую функцию в sinon-1.3.4.js возвращает true для прочитанного json-файла и возвращает false для моего фактического тестового кода async. Не знаю, почему мой callback не находится в коллекции. 'функция some (коллекция, обратный вызов) { for (var index = 0; index user1497630

1

Я знаю, что это старый но я думал, что буду обновлять для гуглеров:

В документах Sinon указано, что autoRespond не подходит для тестов, так как он будет выполняться асинхронно. По умолчанию это значение равно 10 мс, чего достаточно, чтобы наброситься на следующий кадр исполнения, что может привести к некоторым условиям гонки в тестах. Я обнаружил это, потому что у меня были подобные неудачные тестовые случаи, связанные с AJAX.

Я закончил реализацию свойства respondImmediately на fakeServer, который будет синхронно отвечать на любой запрос. Это только что объединилось в проект несколько недель назад (v1.14.0), но если вы обновляетесь до самой новой версии, вы сможете ее получить. Check out the docs here.

Вместо того, чтобы устанавливать this.server.autoRespond недвижимость в true, set this.server.respondImmediately property to true. На данный момент нет необходимости в вызовах this.server.respond().

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

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