2014-01-20 3 views
4

Я пытаюсь выполнить обещание в Ember.RSVP.allКак выполнить Ember.RSVP.all внутри цикла уголек выполнения правильно

App.Foo = Ember.Object.create({ 
    bar: function() { 
     var configuration = ajaxPromise("/api/configuration/", "GET"); 
     Ember.RSVP.all([configuration]).then(function(response) { 
      //do something with the response in here 
     }); 
    } 
}); 

Но поскольку моя интеграция тест высмеивает XHR ж/оттуда запустить цикл тест не пройден с ожидаемой ошибкой «Вы включили режим тестирования, который отключенный вводный цикл» автозапуск»

Так я завернула RSVP с простым ember.run как так

App.Foo = Ember.Object.create({ 
    bar: function() { 
     var configuration = ajaxPromise("/api/configuration/", "GET"); 
     Ember.run(function() { 
      Ember.RSVP.all([configuration]).then(function(response) { 
       //do something with the response in here 
      }); 
     }); 
    } 
}); 

Но я все еще получаю e ошибка по какой-то нечетной причине. Примечание -Если я бегу позже это нормально (это не будет работать, хотя, как мне нужно EXEC код асинхронной для этого теста для корректной работы)

App.Foo = Ember.Object.create({ 
    bar: function() { 
     var configuration = ajaxPromise("/api/configuration/", "GET"); 
     Ember.run.later(function() { 
      Ember.RSVP.all([configuration]).then(function(response) { 
       //do something with the response in here 
      }); 
     }); 
    } 
}); 

Вот мой ajaxPromise -fyi реализация

var ajaxPromise = function(url, type, hash) { 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     hash = hash || {}; 
     hash.url = url; 
     hash.type = type; 
     hash.dataType = 'json'; 

     hash.success = function(json) { 
      Ember.run(null, resolve, json); 
     }; 

     hash.error = function(json) { 
      Ember.run(null, reject, json); 
     }; 

     $.ajax(hash); 
    }); 
} 

Как я могу обернуть Ember.RVSP внутри моего запуска ember с его выбросом этой ошибки?

Update

вот моя испытательная установка (включая мой помощник)

document.write('<div id="ember-testing-container"><div id="wrap"></div></div>'); 
App.setupForTesting(); 
App.injectTestHelpers(); 

test("test this async stuff works", function() { 
    visit("/").then(function() { 
     equal(1, 1, "omg"); 
    }); 
}); 

Единственная часть я оставил вне что я не буду использовать JQuery-mockjax поэтому никаких оберток цикла выполнения xhr mock (и отчасти именно поэтому мне нравится эта библиотека, она не проходит тест, когда я не обертываю асинхронный код циклом запуска, как предлагает основная команда)

ответ

7

Возможно, это связано с тем, как ваши тесты выполняются, поэтому, если вы можете предоставить го, это будет полезно

Я также заметил:

Оказывается, я полагаю, вы также быть (или скоро будете) рующим объект jQXHR JQuery существ уродливым обещания, то отрабатывает с собой по 0 причине , и принудительное выполнение вашего собственного nextTurn на вас. Это вызывает автозапуск. Это произойдет только в сценарии ошибок.

В данной Ember мы разобраться в этом, пути удаления then от объекта jQXHR

см: https://github.com/emberjs/data/blob/4bca3d7e86043c7c5c4a854052a99dc2b4089be7/packages/ember-data/lib/adapters/rest_adapter.js#L539-L541

Я подозреваю следующее очистит это.

var ajaxPromise = function(url, type, hash) { 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     hash = hash || {}; 
     hash.url = url; 
     hash.type = type; 
     hash.dataType = 'json'; 

     hash.success = function(json) { 
      Ember.run(null, resolve, json); 
     }; 

     hash.error = function(json) { 
      if (json && json.then) { json.then = null } // this line 

      Ember.run(null, reject, json); 
     }; 

     $.ajax(hash); 
    }); 
} 

Это довольно печально, и различные отдельные концепции и идеи собираются вместе, чтобы причинить вам боль. Мы надеемся (очень скоро) землю Ember.ajax, которая нормализует все эти сумасшедшие.

чувствовать себя также свободно проверка, как происходит уголек-данных это: https://github.com/emberjs/data/blob/4bca3d7e86043c7c5c4a854052a99dc2b4089be7/packages/ember-data/lib/adapters/rest_adapter.js#L570-L586

+0

Я обновил выше -Давайте мне дать ваше предложение бежать быстро –

+0

спасибо, спасибо, спасибо !!! –

1

Я чувствую вашу боль на этом Торан, я уверен, что это то, что сказал Стефан, мы должны были 1 от mockjax, чтобы получить наши тесты на работать с ним.

https://github.com/kingpin2k/jquery-mockjax/commit/ccd8df8ed7f64672f35490752b95e527c09931b5

// jQuery < 1.4 doesn't have onreadystate change for xhr 
     if ($.isFunction(onReady)) { 
     if (mockHandler.isTimeout) { 
      this.status = -1; 
     } 
     Em.run(function() { 
      onReady.call(self, mockHandler.isTimeout ? 'timeout' : undefined); 
     }); 
     } else if (mockHandler.isTimeout) { 
     // Fix for 1.3.2 timeout to keep success from firing. 
     this.status = -1; 
     } 
+0

Не пропустите эту добавленную выгоду, о которой я упоминал выше (где я хочу, чтобы мои тесты терпели неудачу, когда я делаю асинхронный материал без цикла запуска)? –

+0

ya, вы, похоже, не хотите этого делать. В любом случае Ember.ajax вкратце украсит это, и боль людей должна исчезнуть. –

+0

Toran, он обертывает путь кода ответа в цикле запуска, по существу, то же самое, что и обертывание методов ответа/отклонения в цикле запуска. Стефан, да, мы знаем, что это исправление для группы, пока мы переносим все наши тесты с жасмина на qunit и строим интеграционные тесты. – Kingpin2k

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