System.NullReferenceException con WhoCanHelpMe Unit Test
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
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.