0

私は、Sharp Architecture、NHibernateValidatorなどに基づくWhoCanHelpMeに基づくテストプロジェクトを使用しています。その記述どおり、when_the_profile_tasks_is_asked_to_create_a_profile単体テストは、プロファイルオブジェクトを作成し、問題なく保存します。

これで、プロファイルオブジェクトはCreateProfileDetailsタイプになり、IValidatableインターフェイスを継承する独自のValidatableValueObjectから派生します。

私のクラスがValidatableValueObjectではなくEntityに基づいている場合、問題が表面化します。バリデーターがnullであるため、テストを実行するとSystem.NullReferenceExceptionが発生します。

私はこの悪い行動を解決するのに途方に暮れているのではないかと心配しています。誰かがこれの底に到達するためのいくつかの提案がありますか?

ありがとう、

-テッド-

これはスタックトレースです。


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

4

1 に答える 1

1

S#arp ArchitectureとWhoCanHelpMeの作者は?(WCHM)どちらも、Common Service Locatorを使用して、SharpArch.Core.CommonValidator.IValidatorの実装を検証クラスに提供します。

S#arpアーキテクチャが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);

したがって、EntityWCHMからS#arpに変更する場合は、S#arpが使用ValidatableValueObjectするものをスタブアウトする必要もありGetService(typeof(IValidator))ます。

于 2010-05-09T14:32:15.907 に答える