2013-06-05 4 views
12

Я искал все, и эта ошибка возникает из-за неправильного использования asyncTest. Однако, по документации, похоже, что я делаю это правильно. Я предполагаю, что я где-то пропустил небольшую деталь и нуждаюсь в дополнительной паре глаз ...Ошибка Qunit: утверждение вне контекста проверки

Я пытаюсь проверить код, который делает запрос ajax для получения страницы, а затем загружает ее в лайтбокс , lightbox-content не отображается в DOM до тех пор, пока вызов ajax не завершится и не будет отображаться. Таким образом, я могу проверить это только в моем обратном вызове onComplete, где у меня есть мой тест, чтобы проверить, правильно ли он загрузил его.

Вот мой код:

asyncTest('mytest', 1, function() { 
    utils.lightbox.show('/login', { 
     onComplete: function() { 
      ok($('#lighbox-content').is(':visible'), 'Lightbox loaded the /login page.'); 
      start(); 
     } 
    }); 
}); 

Я получаю ошибку:

Uncaught Error: assertion outside test context, was at HTMLDivElement.window.utils

Может кто-нибудь увидеть, где я неправильно?

+1

Является ли недостающее 't' в' lighbox-content' опечатке при публикации вашего вопроса? –

+0

У меня такое же сообщение об ошибке, ошибка появляется внутри 'on ('load'' callback вместо onComplete, но я думаю, что все равно под капотом. Вы пытались перейти на другую версию QUnit? – Dan

ответ

7

Я согласен с тем, что ваш код соответствует документации, насколько я могу судить.

Update

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

asyncTest('mytest', 1, function() { 
    stop(); 
    ... 
}); 

Я использовал Sinon.JS, чтобы избежать вызова AJAX в первую очередь. Это имеет три непосредственных преимущества:

  1. Я не зависеть от того, как сервер отвечает на запросы.
  2. Я могу указать разные результаты для каждого теста.
  3. Тесты выполняются намного быстрее.

Издевательский может быть выполнен на уровне XMLHttpRequest или по методу jQuery и довольно прост. Вот один пример из одного из моих тестов:

module("geo", { 
    setup: function() { 
     this.server = sinon.fakeServer.create(); 
    }, 

    teardown: function() { 
     this.server.restore(); 
    } 
} 

test("returns detected ZIP code", function() { 
    this.server.respondWith("/geo/detect-zip-from-ip", 
          [ 200, { "Content-Type": "text/html" }, '90210' ]); 
    geo.detectZip(function (zip) { 
     assertThat(zip, is('90210')); 
    }); 
    this.server.respond(); 
}); 
+0

Спасибо David. – intargc

+0

Это была «стоп();» вещь для меня. Спасибо, что напомнили об этом. :) – joaorodr84

+0

@intargc Любые удачи в решении этой проблемы вопрос? –

0

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

Объясняя в словах:

  • У меня есть сложный асинхронный тест
  • Я отсроченное событие, и есть ok и equal утверждения внутри
  • Конечно, все это заворачивается в asyncTest
  • Но, когда тест «завершен», и я звоню start(), обработчики событий остаются там
  • Af тер вызов start(), все дальнейшие вызовы ok внутри этого asyncTest станут незаконными
  • И бросать исключения
  • Интересно, что произойдет, если число в expect (в вашем примере это второй параметр) превышено. Такое же исключение?

Объясняя в коде:

asyncTest('mytest', /*1,*/ function() { 

      function imgLoadedOrFailed (result) { 
       clearTimeout(imageTimeToLive); 
       img.off(); 
       ok(result, 'Image in carousel pane has been loaded'); 
      } 

      var imageTimeToLive = setTimeout(
        imgLoadedOrFailed.bind(this, false), 
        5000), 
       img = panes[index].find('img:first'); 

      if (img) { 
       img.on('load', imgLoadedOrFailed.bind(this, true)); 
       img.on('error', imgLoadedOrFailed.bind(this, false)); 
      } 
     }); 


     // at some point I call: start(); 

В этом примере, когда я "закончить" тест вызова start(), то onload и onerror события могут еще произойти.

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