0

Je travaille avec un projet de test basé sur WhoCanHelpMe, basé sur Sharp Architecture, NHibernateValidator, etc. Comme écrit, le test d'unité when_the_profile_tasks_is_asked_to_create_a_profile crée l'objet profile et l'enregistre sans problème.System.NullReferenceException avec test d'unité WhoCanHelpMe

Maintenant, l'objet de profil est un type CreateProfileDetails qui dérive de leur propre ValidatableValueObject qui hérite de l'interface IValidatable.

Le problème survient lorsque ma classe est basée sur une entité plutôt que sur ValidatableValueObject. Lorsque le test est exécuté, System.NullReferenceException, car Validator est null. J'ai peur de ne pas pouvoir résoudre ce problème. Quelqu'un at-il des suggestions pour aller au fond des choses?

Merci,

-Ted-

Ceci est la trace de la pile:


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 

C'est la hiérarchie des classes:


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} 

Le code source est ici http://code.google.com/p/sharp-architecture/source/browse/trunk/src/SharpArch/SharpArch.Core/DomainModel/ValidatableObject. cs>

Code source pour l'enregistrement de validation: (désolé, je suis un nouvel utilisateur et je ne peux pas l'afficher en tant que lien, vous devrez donc copier/coller) whocanhelpme.codeplex.com/SourceControl/changeset/view/58203 # 883241

+0

Une trace de pile serait très utile. Quelle référence est exactement nulle? D'après ce que vous avez écrit, il semble que la méthode 'Validate()' soit nulle, ce qui est un peu impossible avec C#. –

+0

Je suis assez loin pour voir que ServiceLocator retourne null mais ne pas jeter des exceptions non plus. Cela aboutit finalement à la référence null Validator. – tlum

Répondre

1

Les auteurs de S # arp Architecture et WhoCanHelpMe? (WCHM) utilisent tous deux le Common Service Locator pour fournir une implémentation de SharpArch.Core.CommonValidator.IValidator à leurs classes de validation.

Où S # arp architecture utilise les éléments suivants dans leur SafeServiceLocator<TDependency> classe


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

WCHM utilise les éléments suivants dans leur ValidatableValueObject classe


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

Les gens qui ont écrit WCHM seulement écrasa la méthode GetInstance<IValidator>() pour leur test unitaire


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

Donc, si vous passez à un S # arp Entity du WCHM ValidatableValueObject, il est également nécessaire de remplacer le GetService(typeof(IValidator)) que S # arp va utiliser.