我有以下测试方法:
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)
任何人都可以帮忙吗?
答案 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;方法工作?
非常感谢,最诚挚的问候。