Javascript 为什么此测试中的Qunit计数器从未达到目标值?

Javascript 为什么此测试中的Qunit计数器从未达到目标值?,javascript,jquery,jquery-mobile,qunit,Javascript,Jquery,Jquery Mobile,Qunit,我坐在一个Qunit测试上,很难跟踪到底发生了什么。测试是否来自jQuery Mobile的listview.filter扩展 我不知道变量\u scont如何达到3的值 这是正在讨论的部分 module( "Custom search filter", { setup: function() { var self = this; // initially set to 0 this._refreshCornersCount = 0

我坐在一个Qunit测试上,很难跟踪到底发生了什么。测试是否来自jQuery Mobile的listview.filter扩展

我不知道变量
\u scont
如何达到
3
的值

这是正在讨论的部分

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" );
        }
    ]);
});
我在测试中遗漏了一些代码,因为必要的部分都在那里

在我的机器上,测试从不触发,因为
这个。_refreshCornerScont
被设置为
0
,然后随着两次输入更改增加2倍,每次都触发一个过滤器循环。因此,所有参数(包括我正在测试的参数)都是正确的,只有测试永远不会启动,因为
这一点。_refreshCornerScont=2

问题
我在这上面坐了一会儿。。。也许我遗漏了一些明显的东西,所以:是否有一种技术方法可以实现
这一点。_\u\u\n仅从上述代码片段中搜索
3
的值

编辑: 该测试是来自jQuery Mobile的测试,特别是listview过滤器扩展。你可以找到测试

编辑:
这是我测试的完整代码。注意,我正在执行与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" );

        }
    ]);
});
...

在每个循环结束时调用该函数。在

listPage.find( "input" ).val( "at" ).trigger( "change" );
已调用一次。普雷维乌斯线第二次出现,最后一次出现

listPage.find( "input" ).val( "atw" ).trigger( "change" );
第三个。因此,

this._refreshCornersCount === 3

希望这有帮助。

没有:-(你有主意吗?这是jQuery Mobile的官方测试-看。我不知道它是如何达到3的值…老实说,我以前没有使用过qunit,但我很感兴趣。我会悬赏。你确定测试是正确的吗?@Stijn:yup。请参见上面的编辑。如果下面的答案是正确的,你欠我50多个重复lol。)