2017-02-28 9 views
0

を使用するときに私たちは、断続的OutOfMemoryExceptionsを投げ、当社のCIパイプライン破壊されているいくつかの類似したユニットテストがあります:あなたは私たちはその数字を作成するためにAutoFixtureのジェネレータを使用している見ることができるようにユニットテスト断続OOM例外Autofixtureジェネレータ

public void Evaluate_Node1GreaterThanNode2_ReturnsTrue_Decimal() 
{ 
    //Arrange 
    var generator = _fixture.Create<Generator<decimal>>(); 

    var value1 = _fixture.Create<decimal>(); 
    var value2 = generator.Where(x => x < value1).First(); 
    Node.Node1.Evaluate(Arg.Any<IPeriod>(), Arg.Any<IColleaguePeriodDataManager>()).Returns(value1); 
    Node.Node2.Evaluate(Arg.Any<IPeriod>(), Arg.Any<IColleaguePeriodDataManager>()).Returns(value2); 

    //Act 
    var result = Node.Evaluate(); 

    //Assert 
    Assert.IsTrue(result); 
    Assert.IsTrue(Node.EvaluatedResult); 
} 

generator.Where(x => x < value1).First(); 

明らかにこのアプローチは機能しません。誰もが回避策を持っていますか?ここで

はエラーとスタックトレースです:

System.OutOfMemoryException : Array dimensions exceeded supported range. 
at System.Collections.Generic.HashSet`1.SetCapacity(Int32 newSize, Boolean forceNewHashCodes) 
    at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value) 
    at Ploeh.AutoFixture.RandomNumericSequenceGenerator.GetNextRandom() 
    at Ploeh.AutoFixture.RandomNumericSequenceGenerator.CreateRandom(Type request) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context, T seed) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context) 
    at Ploeh.AutoFixture.Generator`1.<GetEnumerator>d__2.MoveNext() 
    at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() 
    at System.Linq.Enumerable.First[TSource](IEnumerable`1 source) 

答えて

2

テストシナリオがvalue1よりも大きくなるようにvalue2を要求するように見えます。あなたは一時的な変数xyを見たくない場合は、ヘルパーメソッドにこれをリファクタリングすることができます

var x = fixture.Create<decimal>(); 
var y = fixture.Create<decimal>(); 
var value1 = Math.Min(x, y); 
var value2 = Math.Max(x, y) + 0.0001m; // Add small fraction to make it strictly greater 

:それを行う1つの簡単な方法は、このようなものです。

関連する問題