2014-11-14 70 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的上述实施例