Mole System.Random类

时间:2012-09-15 17:25:04

标签: c# random moles pex

我有以下测试方法:

public float coverageJump(bool a)
{
    int c = 0;
first:
    c++;
    Random random = new Random();
    float result = random.Next(0, 100);
    Console.WriteLine(result);

    if(result < 50)
        goto first;
    if (result == 50)
        goto end;

    if (a)
        goto end;
    else
        goto first;

end:
    return c;
}

Pex建议我使用Random.Next moled并创建:

PexMethod:

[PexMethod]
public float coverageJump([PexAssumeUnderTest]ClassMethod target, bool a)
{
    float result = target.coverageJump(a);
    return result;
    // TODO: add assertions to method ClassMethodTest.coverageJump(ClassMethod, Boolean)
}

参数化单元测试

[TestMethod]
[PexGeneratedBy(typeof(ClassMethodTest))]
[PexRaisedException(typeof(NullReferenceException))]
[HostType("Moles")]
public void coverageJumpThrowsNullReferenceException489()
{
    float f;
    RandomPreparation.Prepare();
    ClassMethod s0 = new ClassMethod();
    f = this.coverageJump(s0, false);
}

模拟随机类的准备方法:

[PexPreparationMethod(typeof(Random))]
public static void Prepare()
{
    MRandom.BehaveAsCurrent();
}

我开发了模拟随机类

的prepare方法
MRandom.BehaveAsCurrent();
MRandom mr = new MRandom()
{
    NextInt32Int32 = (b, c) => { return 1; },
    Sample = () => { return 1; },
    InternalSample = () => { return 1; }
};

MRandom.Constructor = (a) => 
{
    // a.Next = (b, c) => { return 1; };
};

MRandom.Behavior = mr.InstanceBehavior;

但我得到以下 NULL异常

--- Description
failing test: NullReferenceException, Riferimento a un oggetto non impostato su un'istanza di oggetto.

float f;
RandomPreparation.Prepare();
ClassMethod s0 = new ClassMethod();
f = this.coverageJump(s0, false);


[TestMethod]
[PexGeneratedBy(typeof(ClassMethodTest))]
[PexRaisedException(typeof(NullReferenceException))]
[HostType("Moles")]
public void coverageJumpThrowsNullReferenceException387()
{
    float f;
    RandomPreparation.Prepare();
    ClassMethod s0 = new ClassMethod();
    f = this.coverageJump(s0, false);
}

异常详情

System.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto.      at System.Int32 System.Random.InternalSample() 
      at System.Double System.Random.Sample() 
      at System.Int32 System.Random.Next(System.Int32 minValue, System.Int32 maxValue) 
    D:\Sviluppo\UNI\TesiTirocinio\src\TutorialsMolePex\BenchMarkTesterTool\BenchMarkTesterToolLib\ClassMethod.cs(154): at System.Single BenchMarkTesterToolLib.ClassMethod.coverageJump(System.Boolean a) 
    D:\Sviluppo\UNI\TesiTirocinio\src\TutorialsMolePex\BenchMarkTesterTool\BenchMarkTesterToolLib.Tests\ClassMethodTest.cs(27): at System.Single BenchMarkTesterToolLib.ClassMethodTest.coverageJump(BenchMarkTesterToolLib.ClassMethod target, System.Boolean a) 

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我在准备方法中找到了解决问题的方法:

<强>准备()

    [PexPreparationMethod(typeof(Random))]
    public static void Prepare()
    {
        MRandom.Behavior = MoleBehaviors.Fallthrough;
        MRandom.AllInstances.NextInt32Int32 = (r, a, b) => { return 50; };
    }

我认为要使用其他实现

        var fake = new SRandom { CallBase = true };
        var mole = new MRandom(fake)
        {
            NextInt32Int32 = (a, b) => { return 1;  }
        };
        MRandom.BehaveAsCurrent();

但不行。有一段时间我认为我不能模拟Random的方法Next因为在Mole Manual Reference中报告: .. Moles框架创建鼹鼠类型,利用运行时检测。在使用静态方法,密封类型或非虚拟方法来处理API时,它们非常有用。

和随机方法接下来是:

        public virtual int Next(
            int minValue,
            int maxValue
        )

有人可以给我一个解释,因为我的准备&#34;方法工作?

非常感谢,最诚挚的问候。