2014-11-14 79 views
4

我試圖測試我的一個函數,但它的一部分使用了控制器中的一個私有變量。 我怎樣才能讓Jasmine從該私有變量中僞造數據?使用私有變量的茉莉花測試函數

window.MyApp = window.MyApp || {}; 


(function(myController) { 

    var deliverablesKoModel; 

    myController.initialize = function(releaseId) { 

     // Ajax call with this success: 

     deliverablesKoModel = new knockOutModel(data); // this model contains an observable array named 'deliverables' 

    }; 

    myController.checkDeliverableNameIsValid = function (deliverable) { 

     var valid = false; 

     if (ko.unwrap(deliverable.name) !== null && ko.unwrap(deliverable.name) !== undefined) { 
      // PROBLEM HERE 
      // when running the test deliverablesKoModel below is always undefined! 
      ///////////// 
      valid = _.all(deliverablesKoModel.deliverables(), function(rel) { 
       return (ko.unwrap(rel.name).trim().toLowerCase() !== ko.unwrap(deliverable.name).trim().toLowerCase() 
        || ko.unwrap(rel.id) === ko.unwrap(deliverable.id)); 
      }); 

     } 

     deliverable.nameIsValid(valid); 

     return valid; 
    }; 


}(window.MyApp.myController = window.MyApp.myController || {})); 

我的茉莉花測試。我試圖將可交付成果KoModel作爲一個全局變量,但是當碰到上面的方法時它總是超出範圍。

describe("checkDeliverableNameIsValid should", function() { 
    var deliverable; 
    beforeEach(function() { 
     window['deliverablesKoModel'] = { 
      deliverables: function() { 
       return fakeData.DeliverablesViewModel.Deliverables; // this is a json object matching the deliverables in the knockout model 
      } 
     }; 

     deliverable = { 
      id: 1, 
      name: "test 1", 
      nameIsValid: function(isValid) { 
       return isValid; 
      } 
     }; 
    }); 

    it("return false if any deliverable already exists with the same name", function() { 
     var valid = myApp.myController.checkDeliverableNameIsValid(deliverable); 

     expect(valid).toBe(false); 
    }); 

}); 

回答

2

deliverablesKoModel是私人你IIFE外代碼。

我不熟悉淘汰賽,但有幾種方法可以設置deliverablesKoModel

  1. 使它成爲您可以設置/獲取的控制器的屬性。
  2. 使您的控制器#initialize方法接受一個回調函數,該函數可以返回模型的一個實例。然後,在測試中調用控制器上的#initialize時,可以發送一個函數。

    var deliverablesKoModel; 
    
    myController.initialize = function(releaseId, modelCallback) { 
    
        // Ajax call with this success: 
    
        deliverablesKoModel = modelCallback(data); //returns a model 
    
    }; 
    

    規格::

    it("return false if any deliverable already exists with the same name", function() { 
        var fakeModel = function(data) { 
         return { 
         deliverables: function() { 
          return fakeData.DeliverablesViewModel.Deliverables; 
         } 
         } 
        }; 
    
    //You didn't initialize your 
    //controller, which made the "private" variable deliverablesKoModel null in your IIFE 
        myApp.myController.initialize(relaseId, fakeModel); 
    
        var valid = myApp.myController.checkDeliverableNameIsValid(deliverable); 
    
        expect(valid).toBe(false); 
    }); 
    

用於方法#2的上述實施例