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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top