2013-07-16 8 views
5

AutoFixtureの作成方法をfloat、double、およびdecimalに変更する方法を教えてください。これらの型が作成されると残りの部分も残されます。Autofixture - 余りを持つfloat、double、またはdecimalを作成する

現在、私はこれを行っていますが、これは例外です。

var fixture = new Fixture(); 
fixture.Customizations.Add(
    new RandomDoublePrecisionFloatingPointSequenceGenerator()); 

RandomDoublePrecisionFloatingPointSequenceGeneratorは、以下のようになります:

internal class RandomDoublePrecisionFloatingPointSequenceGenerator 
    : ISpecimenBuilder 
{ 
    private readonly object syncRoot; 
    private readonly Random random; 

    internal RandomDoublePrecisionFloatingPointSequenceGenerator() 
    { 
     this.syncRoot = new object(); 
     this.random = new Random(); 
    } 

    public object Create(object request, ISpecimenContext context) 
    { 
     var type = request as Type; 
     if (type == null) 
      return new NoSpecimen(request); 

     return this.CreateRandom(type); 
    } 

    private double GetNextRandom() 
    { 
     lock (this.syncRoot) 
     { 
      return this.random.NextDouble(); 
     } 
    } 

    private object CreateRandom(Type request) 
    { 
     switch (Type.GetTypeCode(request)) 
     { 
      case TypeCode.Decimal: 
       return (decimal) 
        this.GetNextRandom(); 

      case TypeCode.Double: 
       return (double) 
        this.GetNextRandom(); 

      case TypeCode.Single: 
       return (float) 
        this.GetNextRandom(); 

      default: 
       return new NoSpecimen(request); 
     } 
    } 
} 

答えて

6

は値のを使用してタイプ(double)を再定義しようと

var fixture = new Fixture(); 
fixture.Customize<double>(sb => sb.FromFactory<double>(d => d * 1.33)); //This should add remainder 
var value = fixture.Create<double>(); 
+0

私は実際には、バックグラウンドでの作業の仕方やカスタマイズが無限の再帰を作成しているとは考えていませんでした。これを明確にしてくれてありがとう! – Rok

+0

+1これはかなりきれいです! :) –

5

1つのオプションは、カスタムISpecimenBuilderを使用することです同じタイプ(double)は、実際に無限再帰を生成します。ただし、シード入力を別のタイプに変更することで簡単にこの作業を行うことができます。 int

var fixture = new Fixture(); 
fixture.Customize<double>(c => c.FromFactory<int>(i => i * 1.33)); 
var value = fixture.Create<double>(); 

倍精度は分数値も持つ傾向があります。

+0

ニコスは助けてくれてありがとう、マークの答えは、私が探していたものともっとインラインです。 – Rok

+1

+1このSpecimenBuilderスレッドを安全にするための理由 - すべてのビルダーでこれを行いますか? (私はSpecimenBuilderでこのガードを追加することは決して私には起こらなかったのですが、なぜなら、乱数を守る必要がある理由を理解しています。 @ ploehのV3.0での不変性の仕事は、達成するのが比較的簡単かもしれません)。または私はブログ投稿を見逃してしまった:P –

+0

+1これはスレッドの安全性なしでも動作する可能性があります。ほとんどすべての数値シーケンスジェネレータはスレッドセーフです。それらの大部分(すべてではないにせよ)は3.0より前に作成されました。 –

関連する問題