0

我有以下测试方法:

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 摩尔及其创建:

Pex方法:

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

我开发了准备方法来模拟 Random 类

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) 

有人能帮忙吗?

4

1 回答 1

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 框架创建了 moles 类型,它利用了运行时检测。它们在处理具有静态方法、密封类型或非虚拟方法的 API 时很有用。

和 Random 的方法 Next 是:

        public virtual int Next(
            int minValue,
            int maxValue
        )

有人可以给我一个解释,因为我的“准备”方法有效吗?

非常感谢,最好的问候。

于 2012-09-17T20:56:52.533 回答