System.NullReferenceException mit WhoCanHelpMe Einheit Test
Frage
Ich bin mit einem Testprojekt arbeiten basierend auf WhoCanHelpMe, die auf Sharp Architektur, NHibernateValidator basiert, usw. Wie der geschrieben das when_the_profile_tasks_is_asked_to_create_a_profile Unit-Test das Profilobjekt erstellt und speichert es, ohne Frage.
Nun ist die Profil-Objekt ist ein CreateProfileDetails Typ, ergibt sich aus ihren eigenen ValidatableValueObject, die die IValidatable Schnittstelle erbt.
Das Problem Flächen, wenn meine Klasse auf einer Entität basiert, anstatt ihre ValidatableValueObject. Wenn der Test einen System.NullReferenceException laufen, weil Validator null ist.
Ich habe Angst, dass ich ratlos bin dieses schlechte Verhalten zu lösen. Hat jemand ein paar Vorschläge müssen den Grund zu bekommen?
Danke,
-Ted -
Dies ist der Stack-Trace:
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
Dies ist die Klassenhierarchie:
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}
Der Quellcode ist hier http://code.google.com/p/sharp-architecture/source/browse/trunk/src/SharpArch/SharpArch.Core/DomainModel/ValidatableObject.cs>
Der Quellcode für die Validierung Anmeldung: (sorry ich bin ein neuer Benutzer und kann nicht schreiben diese als Link, damit Sie kopieren müssen würden / paste) whocanhelpme.codeplex.com/SourceControl/changeset/view/58203# 883.241
Lösung
Die Autoren von S # arp Architektur und WhoCanHelpMe? (WCHM) beide Nutzung des Common Service Locator eine Implementierung von SharpArch.Core.CommonValidator.IValidator ihre Prüfklassen zu liefern.
Wo S # arp-Architektur nutzt die folgenden in ihrer SafeServiceLocator<TDependency>
Klasse
service = (TDependency)ServiceLocator.Current.GetService(typeof(TDependency));
WCHM verwendet die folgende in ihrer ValidatableValueObject
Klasse
return ServiceLocator.Current.GetInstance<IValidator>();
Die Leute, die WCHM nur aus dem GetInstance<IValidator>()
Verfahren für ihren Unit-Test
var validator = new Validator();
provider.Stub(p => p.GetInstance<IValidator>()).Return(validator);
Also, wenn Wechsel zu einem S # arp Entity
vom WCHM ValidatableValueObject
sein auch notwendig, die GetService(typeof(IValidator))
Stub darauf hin, dass S # arp verwenden wird.