System.NullReferenceException с модульным тестом WhoCanHelpMe - PullRequest
0 голосов
/ 07 мая 2010

Я работаю с тестовым проектом на основе WhoCanHelpMe, который основан на Sharp Architecture, NHibernateValidator и т. Д. Как написано, модульный тест when_the_profile_tasks_is_asked_to_create_a_profile создает объект профиля и сохраняет его без проблем.

Теперь объект профиля представляет собой тип CreateProfileDetails, который наследуется от их собственного ValidatableValueObject, который наследует интерфейс IValidatable.

Проблема появляется, когда мой класс основан на Entity, а не на их ValidatableValueObject. При выполнении теста возникает исключение System.NullReferenceException, поскольку Validator имеет значение null.

Боюсь, что не могу решить это плохое поведение. У кого-нибудь есть предложения, чтобы докопаться до этого?

Спасибо

-Ted-

Это трассировка стека:


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 

Это иерархия классов:


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}

Исходный код здесь http://code.google.com/p/sharp-architecture/source/browse/trunk/src/SharpArch/SharpArch.Core/DomainModel/ValidatableObject.cs>

Исходный код для регистрации проверки: (извините, я новый пользователь и не могу опубликовать это как ссылку, поэтому вам придется скопировать / вставить) whocanhelpme.codeplex.com/SourceControl/changeset/view/58203# 883241

1 Ответ

1 голос
/ 09 мая 2010

Авторы S # arp Architecture и WhoCanHelpMe? (WCHM) оба используют Common Service Locator для предоставления реализации SharpArch.Core.CommonValidator.IValidator своим классам проверки.

Где S # arp Architecture использует в своем SafeServiceLocator<TDependency> классе

следующее

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

WCHM использует следующее в своем ValidatableValueObject классе


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

Люди, написавшие WCHM, только заглушали метод GetInstance<IValidator>() для своего модульного теста


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

Таким образом, при переходе на S # arp Entity от WCHM ValidatableValueObject также необходимо исключить GetService(typeof(IValidator)), который S # arp собирается использовать.

...