0

Sharp Architecture, NHibernateValidator 등을 기반으로하는 WhoCanHelpMe를 기반으로하는 테스트 프로젝트로 작업하고 있습니다. when_the_profile_tasks_is_asked_to_create_a_profile 단위 테스트는 프로파일 객체를 생성하고 문제없이 저장합니다.WhoCanHelpMe가있는 System.NullReferenceException 단위 테스트

이제 프로필 개체는 IValidatable 인터페이스를 상속하는 ValidatableValueObject에서 파생 된 CreateProfileDetails 유형입니다.

내 클래스가 ValidatableValueObject가 아닌 Entity를 기반으로 할 때 문제가 발생합니다. 테스트가 실행되면 Validator가 null이므로 System.NullReferenceException이 발생합니다.

나는이 나쁜 행동을 해결하기가 어려울 것 같습니다. 누구든지이 밑바닥까지 도달 할 수있는 제안이 있습니까?

감사합니다,

-Ted-

이 스택 추적입니다 :


should ask the question repository to save the new question : FailedObject reference not set to an instance of an object. 
System.NullReferenceException: Object reference not set to an instance of an object. 
at SharpArch.Core.DomainModel.ValidatableObject.IsValid() 
at FieldAudit.Framework.Validation.ValidatableExtensions.Validate(IValidatable entity) in ValidatableExtensions.cs: line 33 
at FieldAudit.Tasks.QuestionTasks.CreateQuestion(Question question) in QuestionTasks.cs: line 40 
at MSpecTests.FieldAudit.Tasks.when_the_question_tasks_is_asked_to_create_a_question.b__2() in QuestionTasksSpecs.cs: line 137 

이 클래스 계층 구조입니다 :


entity = {FieldAudit.Domain.Question} 
[FieldAudit.Domain.Question] = {FieldAudit.Domain.Question} 
    base {SharpArch.Core.DomainModel.Entity} = {FieldAudit.Domain.Question} 
    base {SharpArch.Core.DomainModel.EntityWithTypedId} = {FieldAudit.Domain.Question} 
     base {SharpArch.Core.DomainModel.ValidatableObject} = {FieldAudit.Domain.Question} 
     Validator = null 
     base {SharpArch.Core.DomainModel.BaseObject} = {FieldAudit.Domain.Question} 

소스 코드가 여기에 HTTP ://code.google.com/p/sharp-architecture/source/browse/trunk/src/SharpArch/SharpArch.Core/DomainModel/ValidatableObject. cs>

유효성 확인 등록을위한 소스 코드 : (미안 해요 저는 새로운 사용자이고 링크로 게시 할 수 없으므로 복사/붙여 넣기가 필요합니다) whocanhelpme.codeplex.com/SourceControl/changeset/view/58203 # 883241

+0

스택 추적은 매우 유용합니다. 어떤 참조가 null입니까? 당신이 작성한 것으로부터 마치'Validate()'메쏘드가 null 인 것처럼 보입니다. 이것은 C#에서는 불가능합니다. –

+0

ServiceLocator가 null을 돌려 주지만 예외를 throw하지는 않는지 충분히 알았습니다. 결국 Validator 참조가 null이됩니다. – tlum

답변

1

S # arp Architecture 및 WhoCanHelpMe의 작성자는 다음과 같습니다. (WCHM)은 Common Service Locator를 사용하여 SharpArch.Core.CommonValidator.IValidator 구현을 유효성 검사 클래스에 제공합니다.

는 S 번호의 ARP 아키텍처는 자신의 SafeServiceLocator<TDependency> 클래스


service = (TDependency)ServiceLocator.Current.GetService(typeof(TDependency)); 

WCHM에 다음을 사용

는 WCHM 만의 GetInstance<IValidator>() 방법을 스텁 쓴


return ServiceLocator.Current.GetInstance<IValidator>(); 

의 사람들 자신의 ValidatableValueObject 클래스에 다음과 같은 사용 단위 테스트


      var validator = new Validator(); 
      provider.Stub(p => p.GetInstance<IValidator>()).Return(validator); 

그래서 WCHM ValidatableValueObject에서 S # arp Entity으로 변경하면 S # arp가 사용할 GetService(typeof(IValidator))을 스텁 아웃해야합니다.