2014-06-11 5 views
14

Sto testando un meccanismo che dovrebbe chiamare il metodo una sola volta e impedire eventuali chiamate successive con il gelsomino, posso vedere allegando i punti di interruzione che il metodo NON viene chiamato la seconda volta, tuttavia il test del gelsomino fallisce. Suppongo che abbia a che fare con spy non progettato per essere utilizzato per più controlli.
Quale sarebbe la soluzione adeguata a una determinata situazione?Come testare se il metodo è stato chiamato solo una volta e non la seconda volta in Jasmine?

JSfiddle of Code that is being tested Non riuscivo a capire come eseguire correttamente jasmine test jsfiddle (la versione di Jasmine che sto utilizzando è 1.3.1 mentre il modello di test è in 1.2.0).

test è simile al seguente:

it("Invoking OnPreQuery will add event listener for OnTheMoveViewPreLoad event. Triggering OnTheMoveViewPreLoad twice will call getChildrenForMasterRecordList only first time", function() { 
      AddTreeSettingsObjectToBC({ bc: bc, Tree: { IncludeChildren: true} }); 
      ComposeMockPageObjWithObservableFieldsWithChildren(); 
      var preQuerySpy = spyOnEvent(onTheMove.PageDataRoles, 'OnPreQuery'); 
      $(onTheMove.PageDataRoles).trigger('OnPreQuery', { knockoutContextName: 'bc' }); 
      expect('OnPreQuery').toHaveBeenTriggeredOn(onTheMove.PageDataRoles); 
      expect(preQuerySpy).toHaveBeenTriggered(); 
      var getChildrenForMasterRecordListSpy = spyOn(window, 'getChildrenForMasterRecordList'); 
      $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' }); 
      expect(getChildrenForMasterRecordListSpy).toHaveBeenCalled(); 
      $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' }); 
      expect(getChildrenForMasterRecordListSpy).not.toHaveBeenCalled(); 
     }); 

codice che è in fase di test: HTML

<div data-role="page"></div> 

Javascript

var onTheMove = function(){}; 
$.extend(onTheMove,{ 
    NullValue : "null", 
    PageDataRoles : 'div[data-role="page"], div[data-role="dialog"]', 
    OnTheMovePrefix : 'OnTheMove_' 
    }); 

$(document).on('OnPreQuery', onTheMove.PageDataRoles, function (e, options) { 
    var isChildAttachmentQueued = true; 
    var knockoutContextName = options.knockoutContextName; 
    if (TreeEnabled(knockoutContextName)) { 
     var isModelReadyToAttachChildren = function() { 
      var isReady = false; 
      if (PageObj[knockoutContextName] != undefined) { 
       isReady = (PageObj[knockoutContextName]().length > 0) && isChildAttachmentQueued; 
      } 

      return isReady; 
     }; 
     var treeSettings = eval(knockoutContextName).Tree; 
     treeSettings.knockoutContextName = knockoutContextName; 
     $(onTheMove.PageDataRoles).on('OnTheMoveViewPreLoad', function (e, options) { 
      if (isModelReadyToAttachChildren()) { 
       getChildrenForMasterRecordList({ 
        parentTable: eval(knockoutContextName).primaryTableName, 
        knockoutContextName: treeSettings.knockoutContextName, 
        parentIdColumn: treeSettings.ParentIdColumn, 
        masterIdColumn: treeSettings.MasterIdColumn 
       }); 
       isChildAttachmentQueued = false; 
      } 
     }); 
    } 
}); 
function getChildrenForMasterRecordList(options) { 
    console.log('beep'); 
} 

risposta

27

capito io, spia ha proprietà callCount che auto -incrementi di uno per ogni chiamata.

it("Invoking OnPreQuery will add event listener for OnTheMoveViewPreLoad event. Triggering OnTheMoveViewPreLoad twice will call getChildrenForMasterRecordList only first time", function() { 
     AddTreeSettingsObjectToBC({ bc: bc, Tree: { IncludeChildren: true} }); 
     ComposeMockPageObjWithObservableFieldsWithChildren(); 
     var preQuerySpy = spyOnEvent(onTheMove.PageDataRoles, 'OnPreQuery'); 
     $(onTheMove.PageDataRoles).trigger('OnPreQuery', { knockoutContextName: 'bc' }); 
     expect('OnPreQuery').toHaveBeenTriggeredOn(onTheMove.PageDataRoles); 
     expect(preQuerySpy).toHaveBeenTriggered(); 
     var getChildrenForMasterRecordListSpy = spyOn(window, 'getChildrenForMasterRecordList'); 
     $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' }); 
     expect(getChildrenForMasterRecordListSpy).toHaveBeenCalled(); 
     $(onTheMove.PageDataRoles).trigger('OnTheMoveViewPreLoad', { knockoutContextName: 'bc' }); 
     expect(getChildrenForMasterRecordListSpy.callCount).toEqual(1); 
    }); 

come da commento

nella Jasmine 2.0 sua

expect(object.func.calls.count()).toBe(1); 
+11

In gelsomino 2.0, questo è cambiato un po '. Ora controlli calls.count() ... ad esempio: expect (object.func.calls.count()). ToBe (1); –