System.NullReferenceException con WhoCanHelpMe Prueba de la unidad
Pregunta
Estoy trabajando con un proyecto de prueba basado en WhoCanHelpMe, que se basa en la arquitectura de Sharp, NHibernateValidator, etc. Como su escrito la prueba unitaria when_the_profile_tasks_is_asked_to_create_a_profile crea el objeto perfil y lo guarda sin problema.
Ahora el objeto de perfil es un tipo CreateProfileDetails que se deriva de su propio ValidatableValueObject que hereda la interfaz IValidatable.
Las superficies de problema cuando mi clase se basa en la entidad más que su ValidatableValueObject. Cuando la prueba se ejecuta un System.NullReferenceException porque Validador es nula.
Me temo que estoy en una pérdida para resolver este mal comportamiento. ¿Alguien tiene algunas sugerencias para llegar al fondo de esto?
Gracias,
-Ted -
Este es el seguimiento de la pila:
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
Esta es la jerarquía de clases:
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}
El código fuente está aquí http://code.google.com/p/sharp-architecture/source/browse/trunk/src/SharpArch/SharpArch.Core/DomainModel/ValidatableObject.cs>
El código fuente para el registro de validación: (lo siento, soy un nuevo usuario y no puede publicar esto como un enlace por lo que tendrá que copiar / pegar) whocanhelpme.codeplex.com/SourceControl/changeset/view/58203# 883.241
Solución
Los autores de S # arp Arquitectura y WhoCanHelpMe? (WCHM) tanto para uso del Servicio Común de localización para el suministro de una implementación de SharpArch.Core.CommonValidator.IValidator a sus clases de validación.
Donde S # arp Arquitectura utiliza el siguiente en su clase SafeServiceLocator<TDependency>
service = (TDependency)ServiceLocator.Current.GetService(typeof(TDependency));
WCHM utiliza el siguiente en su clase ValidatableValueObject
return ServiceLocator.Current.GetInstance<IValidator>();
Las personas que escribieron WCHM sólo se apagaron el método GetInstance<IValidator>()
para su unidad de prueba
var validator = new Validator();
provider.Stub(p => p.GetInstance<IValidator>()).Return(validator);
Por lo tanto, si se cambia a un S # arp Entity
del WCHM ValidatableValueObject
su también necesario apagar el GetService(typeof(IValidator))
que S # arp va a usar.