2014-10-11 3 views
0

Возможно ли разрешить угловое обещание сразу и эффективно привести код в режим синхронного вызова? Я знаю, что это побеждает цель обещаний, но я хочу сделать это для тестирования модулей. Мое тестирование показывает, что тогда вызывается сразу, но я не уверен, есть ли потенциальная проблема времени здесь, где then по-прежнему считается asynch?Устранение обещаний немедленно

function someService(){ 
    var deferred = $q.defer(); 
    deferred.resolve(myObj); 
    return deferred.promise; 
} 

someService().then(function(obj){ 
    //will this be executed right away just like it would if this was a synchronous call? 

    // more code here under test 
}); 

var myVal = 10; 

Будет ли выполняться назначение myVal до последующего обратного вызова? Или я могу доверять тому, что тогда всегда будет сразу?

+0

По моему мнению, это нарушает концепцию правильного модульного тестирования путем изменения путей выполнения кода между модульными тестами и фактическим выполнением приложения. Однако ... Без переопределения реализации углового обещания для 'then' -> Нет, это всегда будет вести себя асинхронно. – SnareChops

+0

Суть заключается в том, чтобы издеваться над сервисом и сосредоточиться на тестировании, не беспокоясь о зависимости от службы. Обычно я отделяю логику до отдельного проверяемого объекта, но у меня нет роскоши менять код здесь. – user4131376

+0

говорит ** независимо от того, когда обещание было или будет разрешено **, что означает, что если результат уже доступен, то также предполагается, что «тогда» вызывается немедленно без какой-либо временной или асинхронной проблемы. –

ответ

0

Ваши юнит-тесты могут издеваться над службой и возвращать обещание; таким образом, ваш .then() может быть протестирован.

Эта тема рассматривается в подобных вопросах:

Суть является:

  • вызова beforeEach и inject издеваться своим servcice,
  • вашего макета службы вернуть promise

Возвращаясь к вашему вопросу:

Будет myVal задание выполняется до того, как то CallBack? Или может Я верю, что тогда всегда будет сразу?

Кто-то (@gp) покрыл это в комментариях. Обратный вызов является асинхронным, поэтому он может быть или не быть выполнен сразу. Чтобы гарантировать, что ваше задание выполнено в правильном порядке, вы можете инициализировать его заранее или в обратном вызове then и правильно подключить их.

+0

Да, это то, что это делает, но тогда все еще называется асинхронно, поэтому кажется, что тест по-прежнему должен обрабатывать этот аспект в дополнение к тому, что я действительно хочу проверить. – user4131376

+0

вопрос ** почему ** вам нужно, чтобы он был синхронным? плюс, если обещание уже разрешено, 'then()' сразу вызывается. – dnozay

+0

Это как раз то, как у меня есть мой тестовый структурированный, но, похоже, у него может быть потенциальная ошибка времени, когда тест может быть выполнен до того, как он будет выполнен.Я не вижу защиты, которая гарантирует, что все последующие предложения будут выполнены. – user4131376

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