2015-01-30 3 views
0

데이터가 배열에 입력되었는지 확인하기 위해 재스민 테스트를 작성하려고합니다. 뷰 모델, 유닛 (재스민) 테스트 파일 및 유닛 테스트를위한 정보를 설정하는 스테이지 파일이 있습니다. 내가 얻는 오류는 배열이 정의되지 않았다는 것입니다. 오류 메시지에 "{SiteId : 0, FirstName : 'Jon', LastName : 'Walker', ObjectState : 1}이 될 것으로 예상되지 않았습니다."배열에 대한 재스민 테스트가 계속 실패합니다

이것은 내 viewModel입니다. 이것은 자스민 시험에 대한 정보를 초기화하는 내 단계 파일이

var EF = (function() { 
    return { 
     ObjectState: { 
      Unchanged: 0, 
      Added: 1, 
      Modified: 2, 
      Deleted: 3 
     } 
    }; 
})(); 

var patientMapping = { 
    'Patients': { 
     key: function (patient) { 
      return ko.utils.unwrapObservable(patient.PatientId); 
     }, 
     create: function (options) { 
      return new PatientViewModel(options.data); 
     } 
    } 
}; 

PatientViewModel = function (data) { 
    var self = this; 
    ko.mapping.fromJS(data, {}, self); 

    self.flagPatientAsEdited = function() { 
     if (self.ObjectState() != ObjectState.Added) { 
      self.ObjectState(ObjectState.Modified); 
     } 
     return true; 
    }, 
    self.FullName = ko.computed(function() { 
     return (self.FirstName() + " " + self.LastName()); 
    }); 
} 

SiteViewModel = function (data) { 
    var self = this; 
    ko.mapping.fromJS(data, patientMapping, self); 

    self.save = function() { 
     $.ajax({ 
      url: "/Site/Save/", 
      type: "POST", 
      data: ko.toJSON(self), 
      contentType: "application/json", 
      success: function (data) { 
       if (data.siteViewModel != null) { 
        alert("Changes were saved successfully."); 
        ko.mapping.fromJS(data.siteViewModel, {}, self); 
       } 
       if (data.newLocation != null) { 
        window.location = data.newLocation; 
       } 
      } 
     }); 
    }, 

    self.flagSiteAsEdited = function() { 
     if (self.ObjectState() != ObjectState.Added) { 
      self.ObjectState(ObjectState.Modified); 
     } 
     return true; 
    }, 

    self.addPatient = function() { 
     var patient = new PatientViewModel({ SiteId: 0, FirstName: "", LastName: "", ObjectState: ObjectState.Added }); 
     self.Patients.push(patient); 
    }, 

    self.deletePatient = function (patient) { 
     self.Patients.remove(this); 

     if (patient.PatientId() > 0 && self.PatientsToDelete.indexOf(patient.PatientId()) == -1) { 
      self.PatientsToDelete.push(patient.PatientId()); 
     } 
    }; 
} 

이다 : 나는 self.addPatient을 테스트하기 위해 노력하고

/// <reference path="../../lib/jasmine.js"/> 
/// <reference path="../../lib/mock-ajax.js" /> 
/// <reference path="../../jquery-2.1.3.min.js" /> 
/// <reference path="../../lib/jasmin-jquery.js" /> 
/// <reference path="../../bootstrap.js" /> 
/// <reference path="../../knockout-3.2.0.js" /> 
/// <reference path="../../knockout.mapping-latest.js" /> 
/// <reference path="SiteViewModelStage.js" /> 
/// <reference path="../../siteviewmodel.js" /> 

describe("Add patient check:", function() { 
    beforeEach(function() { 
     OBP.Testing.reset() 
    }); 

    var Patients = new Array(); 
    var viewModel = new SiteViewModel({ patient: window.patient }); 

    it("Add patient works", function() { 
     expect(Patients[0]).toBe(patient); 
    }); 
}); 
:

//staged data for view model testing 

var OBP = OBP || {}; 

OBP.Testing = (function() { 

    var reset = function() { 

     var isReadOnly = true; 

     window.isReadOnly = true; 
     window.ObjectState = 2; 
     window.FirstName = "Joe"; 
     window.LastName = "Mitchell"; 
     window.SiteId = 5; 
     window.patient = { "SiteId": 0, "FirstName": "Jon", "LastName": "Walker", "ObjectState": 1 }; 
     window.patientDelete = { "PatientId": 1, "SiteId": 0, "FirstName": "Frank", "LastName": "Smith", "ObjectState": 1 }; 
    }; 

    return { 
     reset: reset 
    }; 
})(); 

OBP.Testing.reset(); 

이것은 실패 내 자스민 시험 자체가

내 재스민 테스트 디버깅에 도움을 주시면 큰 도움이 될 것입니다. 뷰 모델에서

self.Patients = ko.observableArray(); 

편집 addPatient :

+0

'Patients'는'describe()'에 정의 된 길이가 0 인 배열이다. 함수에 전달되지 않으므로 수정되지 않습니다. '환자 [0]'은 정의되지 않습니다. – xverges

+0

그게 정의되지 않은 부분이 어디서 오는지 알지만,'self.addPatient'는'self.Patients.push (patient);'를 가지고 있습니다. 그래서 정의되지 않은 이유는 모르겠습니다. – AtlasBowler

+1

'addPatient'가 사용하는 변수 인'SiteViewModel .Patients'와는 관계가없는 테스트에 의해 검사 된 지역 변수'var Patients = new Array();'가 있습니다. 반면에, 당신은'Patients'를 배열로 초기화하지 않고,'push '를 호출하면 작동하지 않습니다. – xverges

답변

0

나는 환자와 뷰 모델에서 관찰 배열했다

self.addPatient = function (patient) { 
    self.Patients.push(patient); 
}, 

을하고 "환자 검사 추가"단위 테스트 수정 :

describe("Add patient check:", function() { 
    beforeEach(function() { 
     OBP.Testing.reset() 
    }); 

    var viewModel = new SiteViewModel({ patient: window.patient }); 
    viewModel.addPatient(new PatientViewModel({ PatientId: 1, SiteId: 0, FirstName: "", LastName: "", ObjectState: ObjectState.Added })); 

    it("Add patient works", function() { 
     expect(viewModel.Patients().length == 1).toBe(true); 
    }); 
}); 

viewmodel 및 단위 테스트에 대한 이러한 변경 사항이 내 문제를 해결했습니다. 여기에서 나는 또한 환자의 이름을 확인하고 확인하기 위해 다른 검사를 할 수 있습니다. 주석에서 Xv의 설명은 나를이 솔루션으로 이끄는 데 도움이되었다.

+1

** 재스민 스타일 : ** 테스트에서'viewModel'을 생성하고'addPatient'를 호출하는 것은 테스트 내부 또는'beforeEach' 내부에 속합니다. 그곳에 아무런 토지가 없으면 즉시 문제가 발생합니다. 다른 테스트를 추가했습니다. ** Stackoverflow 스타일 : ** 질문이 해결되면 자신의 대답을 수락하고, 당신을 도운 투표 의견을 올리십시오. 건배! – xverges

관련 문제