2014-11-14 1 views
4

내 함수 중 하나를 테스트하려고하는데 컨트롤러의 일부가 개인 변수를 사용합니다. Jasmine이 개인 변수에서 데이터를 가짜로 만들려면 어떻게해야합니까?개인 변수를 사용하는 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 || {})); 

마이 재스민 테스트. 나는 deliverablesKoModel을 전역 변수로 사용하려고 시도했지만 위의 메서드를 사용할 때는 항상 범위를 벗어났습니다.

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

deliverablesKoModelIIFE의 외부 코드에 비공개입니다.

녹아웃에 익숙하지 않지만 몇 가지 방법으로 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는

관련 문제