2013-07-16 17 views
5

AutoFixture oluşturma yöntemini float, double ve decimal için nasıl değiştirebilirim, böylece bu türler oluşturulduğunda kalanlar da olur mu?Otomatik Düzeltme - kalanı ile bir kayan nokta, ikili veya ondalık oluşturmak

Şu anda bunu yapıyorum, ancak bu istisna atar.

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

RandomDoublePrecisionFloatingPointSequenceGenerator aşağıda gibi görünebilir::

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); 
     } 
    } 
} 

cevap

6

bir değer arasında kullanarak bir tür (double) yeniden tanımlamak için çalışılıyor

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

Sanırım arka planda işlerin nasıl yürüdüğünü ve özelleştirmenin sonsuz bir özyineleme yarattığını düşünmedim. Bunu açıkladığın için teşekkürler! – Rok

+0

+1 Bu oldukça düzgün! :) –

5

Seçeneklerden biri özel bir ISpecimenBuilder kullanmaktır Aynı tür (double) aslında sonsuz bir geri çekilme verecektir. Bununla birlikte, bu çalışmayı tohum girişini başka bir türe dönüştürerek kolayca yapabilirsiniz - örn. Bir int:

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

Çiftler artık çok kesirli değerlere sahip eğiliminde olacaktır.

+0

Nikos yardımın için teşekkürler, ancak Mark'ın cevabı aradığım şeyle daha uyumludur. – Rok

+1

+1 Bu SpecimenBuilder parçacığını güvenli hale getirmenin herhangi bir nedeni - bunu tüm yapımcılarınız için yapıyor musunuz? (Bir Rastgele'nin neden korunmak zorunda olduğunu anlıyorum, bu korumayı bir SpecimenBuilder'a eklemek için hiçbir zaman oluşmamıştı. Fikstür ve/veya Jeneratörler garantili threadafe olarak aynı şekilde yayılan hiçbir zaman olmasa da. @ ploeh'in V3.0'daki ölçülebilirlik çalışması, elde edilmesi için nispeten kolay olabileceği belirtilmiştir). Ya da bir blog gönderisini kaçırdım: P –

+0

+1 Bu, iş parçacığı güvenliği olmadan da çalışabilir. Neredeyse tüm sayısal dizi oluşturucular iplik güvenlidir. Çoğu (hepsi olmasa bile) 3.0'dan önce oluşturulmuştur. –