2013-06-16 1 views
4

나는 Qunit 테스트에 앉아 있고 무슨 일이 일어나고 있는지 지켜보고 있습니다. jQuery Mobile의 listview.filter 확장에서 테스트.이 테스트의 Qunit 카운터가 목표 값에 도달하지 않는 이유는 무엇입니까?

변수 _refreshCornersCount3 값에 어떻게 도달했는지 나는 단서가 없습니다.

여기에 문제의 부분이 있습니다.

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"); 
     } 
    ]); 
}); 

필자는 필요한 부분이 모두 있기 때문에 테스트에서 일부 코드를 제외했습니다.

내 컴퓨터에서는 this._refreshCornersCount0으로 설정되어 있고 두 번의 입력 변경으로 2 배 증가하여 각각 필터 루프를 트리거하기 때문에 테스트가 실행되지 않습니다.
지금 잠시 동안이에 앉아있어 ... 어쩌면 내가 ': 그래서 (나는를 테스트하고있어 포함) 모든 매개 변수 만 테스트가 결코 발사하지 this._refreshCornersCount = 2

질문 때문에 정확 위의 코드 조각에서 3의 값에 도달하는 기술적 인 방법은 this._refreshCornersCount인가요?

EDIT : 테스트는 jQuery Mobile의 테스트, 특히 listview 필터 확장입니다. 당신은 테스트를 here

편집을 찾을 수 있습니다 : 그래서 여기
내 시험의 전체 코드입니다. 참고 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"); 

     } 
    ]); 
}); 
... 
+0

이 문제가 해결 되었습니까? – Omar

+0

nope. :-(아이디어가 있습니까? jQuery Mobile의 공식 테스트입니다. [여기] (https://github.com/jquery/jquery-mobile/blob/master/tests/integration/listview/listview_core.js#L657)를 참조하십시오.) 내가 3의 가치에 도달하는 방법에 대한 단서가 없다 ... – frequent

+1

솔직히 말해서 나는 qunit을 사용하지 않았지만 흥미가있다. 현상금을 세울 것이다 – Omar

답변

1

이 기능은 각주기의 끝에 호출됩니다. 전화하기 전에

listPage.find("input").val("at").trigger("change"); 

가 이미 호출되었습니다. 선행 선에 그것은 두번째로오고, 마지막 선에

listPage.find("input").val("atw").trigger("change"); 

세 번째. 따라서

this._refreshCornersCount === 3 

희망이 있습니다.