jQuery BBQ provides window.onhashchange -> http://benalman.com/projects/jquery-bbq-plugin/
And in the unit tests, many of which are asynchronous, a queue of callbacks is used to execute them in order. See the "run_many_tests" function in the jQuery BBQ unit tests page to see how I implemented it. - Ben On Oct 23, 8:29 pm, gMinuses <gminu...@gmail.com> wrote: > Thank you! This really does the trick, but now the real problem is to > using a setInterval to check location.hash to implement an > "onhashchange" event. These events are all asynchronous, and I can't > get my tests passed, here is the test case: > > http://dl.getdropbox.com/u/1402827/hashchange/index.html > > I didn't make any ajax call. > > On Oct 24, 5:04 am, Ricardo Tomasi <ricardob...@gmail.com> wrote: > > > > > Just use sync: true in all tests and put an end to this discussion :) > > > On Oct 22, 9:26 pm, gMinuses <gminu...@gmail.com> wrote: > > > > I'd like to test the following code to make sure: > > > > 1. setTimeout calls the function > > > 2. ajax success callback is called > > > > setTimeout(function() { > > > > $.ajax({ > > > url: './index.html', > > > success: function() {} > > > }) > > > > }, 100); > > > > If I only have one nested asynchronous test like this, it works: > > > > asyncTest('asyncTest', function() { > > > setTimeout(function() { > > > console.log(1); > > > ok(true, 'success'); > > > start(); > > > > asyncTest('nested asyncTest', function() { > > > $.ajax({ > > > url: './index.html', > > > success: function() { > > > console.log(2); > > > ok(true, 'ajax success'); > > > start(); > > > } > > > }) > > > }) > > > > }, 100) > > > > }) > > > > But if there are multiple tests, it works, but run out of order: > > > > asyncTest('asyncTest', function() { > > > setTimeout(function() { > > > console.log(1); > > > ok(true, 'success'); > > > start(); > > > > asyncTest('nested asyncTest', function() { > > > $.ajax({ > > > url: './index.html', > > > success: function() { > > > console.log(2); > > > ok(true, 'ajax success'); > > > start(); > > > } > > > }) > > > }) > > > > }, 100) > > > > }) > > > > asyncTest('another asyncTest', function() { > > > setTimeout(function() { > > > console.log(3); > > > ok(true, 'another success'); > > > start(); > > > > asyncTest('another nested asyncTest', function() { > > > $.ajax({ > > > url: './index.html', > > > success: function() { > > > console.log(4); > > > ok(true, 'another ajax success'); > > > start(); > > > } > > > }) > > > }) > > > > }, 100) > > > > }) > > > > If you open firebug, you can see the order is "1,3,2,4", which can > > > cause disasters. > > > > The real world problem is that I use setInterval to periodically check > > > location.hash to implement a cross-browser "onhashchange" event, and I > > > bind a function to this event, when the function gets called, it will > > > make an ajax call. I set a different value to location.hash in every > > > test to trigger the event, which is actually asynchronous. So how do I > > > use qunit to test this code? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to jquery-dev@googlegroups.com To unsubscribe from this group, send email to jquery-dev+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=en -~----------~----~----~----~------~----~------~--~---