I am sitting on the Qunit test and have difficulty with what is happening. Test if from the jQuery Mobile extension listview.filter.
I don't know how the _refreshCornersCount variable ever reaches a value of 3 .
Here is the part in question.
module( "Custom search filter", { setup: function() { var self = this; // initially set to 0 this._refreshCornersCount = 0; this._refreshCornersFn = $.mobile.filterbar.prototype._addFirstLastClasses; this.startTest = function() { return this._refreshCornersCount === 1; }; // _refreshCorners is the last method called in the filter loop // so we count the number of times _refreshCorners gets invoked // to stop the test $.mobile.filterbar.prototype._addFirstLastClasses = function() { // increase by 1 self._refreshCornersCount += 1; self._refreshCornersFn.apply( this, arguments ); if ( self.startTest() ) { start(); } } }, teardown: function() { $.mobile.filterbar.prototype._refreshCorners = this._refreshCornersFn; } }); asyncTest( "Custom filterCallback iterates on all list elements", function(){ var listPage = $( "#search-customfilter-test" ), filterCallbackCount = 0, expectedCount = 2 * listPage.find("li").length; expect( 1 ); this.startTest = function() { // trigger once _refreshCornersCount reaches 3 if ( this._refreshCornersCount === 3 ) { equal( filterCallbackCount, expectedCount, "filterCallback called "+ expectedCount +" times" ); } // return true/false return this._refreshCornersCount === 3; } $.testHelper.pageSequence( [ ... // triggers a change, // which will triggers a filter loop listPage.find( "input" ).val( "at" ).trigger( "change" ); listPage.find( "input" ).val( "atw" ).trigger( "change" ); } ]); });
I missed some code from the test, because all the necessary details.
On my machine, the test never runs because this._refreshCornersCount set to 0 , and then increments 2x with two input changes, each of which starts the filter loop. Thus, all parameters (including the ones I'm testing) are correct, only the test never works, because this._refreshCornersCount = 2
Question :
I have been sitting on this for a while ... maybe I am missing something obvious, like this: is there a technical way for this._refreshCornersCount to reach value 3 only from the above code snippet?
EDIT : A test is a test from jQuery Mobile, in particular an extension to the watch list. You can find the test here.
EDIT ::
So, here is the complete code for my test. Note. I am doing the same setup as in JQM.
module( "Custom search filter", { setup: function() { var self = this; this._refreshCornersCount = 0; this._refreshCornersFn = $.mobile.filterbar.prototype._addFirstLastClasses; this.startTest = function() { return this._refreshCornersCount === 1; }; // _refreshCorners is the last method called in the filter loop // so we count the number of times _refreshCorners gets invoked to stop the test $.mobile.filterbar.prototype._addFirstLastClasses = function() { self._refreshCornersCount += 1; self._refreshCornersFn.apply( this, arguments ); if ( self.startTest() ) { start(); } } }, teardown: function() { $.mobile.filterbar.prototype._refreshCorners = this._refreshCornersFn; } }); asyncTest( "Custom filterCallback should cause iteration on all list elements", function(){ var listPage = $( "#search-customfilter-test" ), filterCallbackCount = 0, expectedCount = 2 * listPage.find("li").length; expect( 1 ); this.startTest = function() { // XXX NOTE: changed this to 2x, because two changes, trigger 2x _onKeyUp // and 2x addFirstLastClasses. I never reach 3 with the code as-is if ( this._refreshCornersCount === 2 ) { equal( filterCallbackCount, expectedCount, "filterCallback should be called exactly "+ expectedCount +" times" ); } return this._refreshCornersCount === 2; } $.testHelper.pageSequence( [ function(){ //reset for relative url refs $.mobile.changePage( home ); }, function() { $.mobile.changePage( "#search-customfilter-test" ); }, function() { // set the listview instance callback listPage.find( "ul" ).filterbar( "option", "filterCallback", function( text, searchValue, item ) { filterCallbackCount += 1; return text.toString().toLowerCase().indexOf( searchValue ) === -1; }); // trigger a change in the search filter listPage.find( "input" ).val( "at" ).trigger( "change" ); listPage.find( "input" ).val( "atw" ).trigger( "change" ); } ]); }); ...