Domanda

Sto lavorando con un progetto di test basata su WhoCanHelpMe, che si basa su Sharp Architettura, NHibernateValidator, ecc Come il suo scritto unit test when_the_profile_tasks_is_asked_to_create_a_profile crea l'oggetto profilo e lo salva senza problemi.

Ora l'oggetto profilo è un tipo CreateProfileDetails che deriva dalla loro ValidatableValueObject che eredita l'interfaccia IValidatable.

Il problema emerge quando la mia classe è basata su un'entità piuttosto che la loro ValidatableValueObject. Quando il test viene eseguito uno System.NullReferenceException perché Validator è nullo.

Ho paura che io sono in perdita per risolvere questo cattivo comportamento. Qualcuno ha qualche suggerimento per andare a fondo di questo?

Grazie,

formattato -

Questa è l'analisi dello stack:


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 

Questa è la gerarchia delle classi:


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}

Il codice sorgente è qui http://code.google.com/p/sharp-architecture/source/browse/trunk/src/SharpArch/SharpArch.Core/DomainModel/ValidatableObject.cs>

Il codice sorgente per la registrazione di convalida: (scusate io sono un nuovo utente e non possono inserire questo come un link in modo dovrete copiare / incollare) whocanhelpme.codeplex.com/SourceControl/changeset/view/58203# 883.241

È stato utile?

Soluzione

Gli autori di S # arp Architettura e WhoCanHelpMe? (WCHM) sia per uso del Servizio comune Locator di fornire un'implementazione di SharpArch.Core.CommonValidator.IValidator alle loro classi di convalida.

Dove S # arp Architettura utilizza il seguente nella loro classe SafeServiceLocator<TDependency>


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

WCHM utilizza il seguente nella loro classe ValidatableValueObject


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

Le persone che hanno scritto WCHM stub solo il metodo GetInstance<IValidator>() per la loro prova di unità


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

Quindi, se si passa a un S # arp Entity dal WCHM ValidatableValueObject sua anche necessario spegnere il GetService(typeof(IValidator)) che S # arp sta per l'uso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top