2015-11-10 7 views
5

の原因。私はFooプロパティを持つBarオブジェクトを作成しようとしたらしかし、私はObjectCreationExceptionを得る:フー:カスタマイズAutoFixureを使用してFromSeedは、2つのクラスを考えると例外

飾らISpecimenBuilderは、要求に基づいて、試料を作成できませんでした。これは、要求がインタフェースクラスまたは抽象クラスを表す場合に発生します。この場合、要求に基づいて標本を作成できるISpecimenBuilderを登録します。これが強く型付けされたBuild式で発生する場合は、IFactoryComposerメソッドの1つを使用してファクトリを提供してみてください。

私はTestFooFactoryはちょうど私がシード値なしFooを作成したときのように、Barの作成中にnullシード値を渡されることを期待したいです。私は何か間違っているのですか、これはバグでしょうか?

実際のシナリオでは、シード値を渡すときにAutoFixtureが特定のオブジェクトのシード値をどのように使用するかをカスタマイズしたいが、シードがない場合でもAutoFixtureを通常の動作に戻したい。

+3

GitHubにクロスポストされています:https://github.com/AutoFixture/AutoFixture/issues/467 –

答えて

5

シード値is correctを使用するようにFixtureをカスタマイズする方法。

表示される動作は、FromSeedカスタマイズがAutoFixtureパイプラインを変更する方法の結果です。詳細を読むことに興味があるなら、私はそれらをhereと記述しました。回避策として

、あなたがこのようなシードの要求のためのカスタム標本ビルダーを使用することができます。

public class RelaxedSeededFactory<T> : ISpecimenBuilder 
{ 
    private readonly Func<T, T> create; 

    public RelaxedSeededFactory(Func<T, T> factory) 
    { 
     this.create = factory; 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     if (request != null && request.Equals(typeof(T))) 
     { 
      return this.create(default(T)); 
     } 

     var seededRequest = request as SeededRequest; 

     if (seededRequest == null) 
     { 
      return new NoSpecimen(request); 
     } 

     if (!seededRequest.Request.Equals(typeof(T))) 
     { 
      return new NoSpecimen(request); 
     } 

     if ((seededRequest.Seed != null) 
      && !(seededRequest.Seed is T)) 
     { 
      return new NoSpecimen(request); 
     } 

     var seed = (T)seededRequest.Seed; 

     return this.create(seed); 
    } 
} 

あなたは、このようなタイプFooのオブジェクトを作成するためにそれを使用することができます:

fixture.Customize<Foo>(c => c.FromFactory(
    new RelaxedSeededFactory<Foo>(TestFooFactory))); 

をこのカスタマイズはFooのプロパティを設定するときnull - TestFooFactoryファクトリ関数のシードとしてdefault(Foo)を渡します。

+0

これは魅力的です!回避策をありがとう。 –

+2

カスタムの「RelaxedSeededFactory」標本作成ツールを_better_アプローチで更新しました。すべてのリクエストを処理する代わりに、 'T 'のシードされたリクエストとシードされていないリクエストのみを処理します。 –

+1

アップデートと同様に、AutoFixture 3.36.12ではこの問題が修正されています:https://github.com/AutoFixture/AutoFixture/commit/c7ce7d239a26fd7aef8c464ba214c366681d0886。ありがとう@エリコ! –

関連する問題