C# 使用unittesting覆盖此代码块中的所有块
我试图覆盖这段代码中的所有块。代码覆盖率表示,所有行似乎都被覆盖了。但是有两个街区没有盖,我不知道怎么盖 这是我为之编写单元测试的代码:C# 使用unittesting覆盖此代码块中的所有块,c#,unit-testing,C#,Unit Testing,我试图覆盖这段代码中的所有块。代码覆盖率表示,所有行似乎都被覆盖了。但是有两个街区没有盖,我不知道怎么盖 这是我为之编写单元测试的代码: public TRange Intersect(TRange range) { Validator.IsNotNull(range, "range"); if (!HasOverlap(range)) return null; return Calculator.FromStartStop( Tools.
public TRange Intersect(TRange range)
{
Validator.IsNotNull(range, "range");
if (!HasOverlap(range))
return null;
return Calculator.FromStartStop(
Tools.Max(Start, range.Start) ?? Start ?? range.Start,
Tools.Min(Stop, range.Stop) ?? Stop ?? range.Stop);
}
解释:此代码返回两个范围的交集:假设您有一个[10..20]的整数(以下简称:IntRange)和一个[15..25]的整数;相交的结果将是[15..20]。如上所述,它采用启动的最大值和停止的最小值
验证器检查空范围。HasOverlap检查两个范围是否相互“内部”[10..20]和[15..25]是,但[10..20]和[25..30]不是
到目前为止,我的单元测试覆盖了38个街区中的36个街区
[TestMethod]
public void IntersectTest()
{
IntRange intRange510 = IntRange.FromStartStop(5, 10);
IntRange intRange520 = IntRange.FromStartStop(5, 20);
IntRange intRange4050 = IntRange.FromStartStop(40, 50);
IntRange intRange1020 = IntRange.FromStartStop(10, 20);
IntRange intRange1530 = IntRange.FromStartStop(15, 30);
IntRange intRange2030 = IntRange.FromStartStop(20, 30);
IntRange intRangenull5 = IntRange.FromStartStop(null, 5);
IntRange intRangenull10 = IntRange.FromStartStop(null, 10);
IntRange intRangenull20 = IntRange.FromStartStop(null, 20);
IntRange intRange5null = IntRange.FromStartStop(5, null);
IntRange intRange10null = IntRange.FromStartStop(10, null);
IntRange intRange20null = IntRange.FromStartStop(20, null);
IntRange intRangenullnull = IntRange.FromStartStop(null, null);
//4x x/null
Assert.AreEqual(intRangenullnull, intRangenullnull.Intersect(intRangenullnull));
Assert.AreEqual(IntRange.FromStartStop(15,20), intRange1020.Intersect(intRange1530));
// 3x nulltest
Assert.AreEqual(intRange10null, intRange10null.Intersect(intRangenullnull));
Assert.AreEqual(intRangenull10, intRangenull10.Intersect(intRangenullnull));
Assert.AreEqual(intRange10null, intRangenullnull.Intersect(intRange10null));
Assert.AreEqual(intRangenull10, intRangenullnull.Intersect(intRangenull10));
// 2x nulltest
Assert.AreEqual(intRange1020, intRangenullnull.Intersect(intRange1020));
Assert.AreEqual(intRangenull10, intRangenull10.Intersect(intRangenull20));
Assert.AreEqual(intRangenull10, intRangenull20.Intersect(intRangenull10));
Assert.AreEqual(intRange510, intRangenull10.Intersect(intRange5null));
Assert.AreEqual(intRange510, intRange5null.Intersect(intRangenull10));
Assert.AreEqual(intRange10null, intRange10null.Intersect(intRange5null));
Assert.AreEqual(intRange20null, intRange10null.Intersect(intRange20null));
Assert.AreEqual(intRange1020, intRange1020.Intersect(intRangenullnull));
// 1x nulltest
Assert.AreEqual(intRange510, intRangenull10.Intersect(intRange510));
Assert.AreEqual(intRange510, intRangenull10.Intersect(intRange520));
Assert.AreEqual(intRange1020, intRange10null.Intersect(intRange1020));
Assert.AreEqual(intRange1020, intRange10null.Intersect(intRange520));
Assert.AreEqual(intRange510, intRange510.Intersect(intRangenull20));
Assert.AreEqual(intRange510, intRange520.Intersect(intRangenull10));
Assert.AreEqual(intRange2030, intRange1530.Intersect(intRange20null));
Assert.AreEqual(intRange1530, intRange1530.Intersect(intRange5null));
// No overlap
Assert.IsNull(intRange510.Intersect(intRange4050));
}
[TestMethod]
[ExpectedException(typeof(ValidationException))]
public void EmptyIntersectTest()
{
IntRange intRange = null;
_Range10To20.Intersect(intRange);
}
我还检查了反编译(和转换)代码,但找不到缺少的内容:
public TRange Intersect(TRange range)
{
Validator.IsNotNull(range, "range");
TRange result;
if (!this.HasOverlap(range))
{
result = default(TRange);
}
else
{
RangeCalculatorBase<TRange, TStartStop, TLength> arg_ED_0 = Range<TRange, TStartStop, TLength>.Calculator;
TStartStop? tStartStop = Tools.Max<TStartStop?>(this.Start, range.Start);
TStartStop? arg_ED_1;
if (!tStartStop.HasValue)
{
TStartStop? tStartStop2 = this.Start;
arg_ED_1 = (tStartStop2.HasValue ? new TStartStop?(tStartStop2.GetValueOrDefault()) : range.Start);
}
else
{
arg_ED_1 = new TStartStop?(tStartStop.GetValueOrDefault());
}
tStartStop = Tools.Min<TStartStop?>(this.Stop, range.Stop);
TStartStop? arg_ED_2;
if (!tStartStop.HasValue)
{
TStartStop? tStartStop2 = this.Stop;
arg_ED_2 = (tStartStop2.HasValue ? new TStartStop?(tStartStop2.GetValueOrDefault()) : range.Stop);
}
else
{
arg_ED_2 = new TStartStop?(tStartStop.GetValueOrDefault());
}
result = arg_ED_0.FromStartStop(arg_ED_1, arg_ED_2);
}
return result;
}
公共交通交叉口(交通范围)
{
IsNotNull(范围,“范围”);
交易结果;
如果(!this.HasOverlap(范围))
{
结果=默认值(TRange);
}
其他的
{
RangeCalculatorBase arg_ED_0=Range.Calculator;
TStartStop?TStartStop=Tools.Max(this.Start,range.Start);
TStartStop?arg_ED_1;
如果(!tStartStop.HasValue)
{
TStartStop?tStartStop2=此.Start;
arg_ED_1=(tStartStop2.HasValue?new TStartStop?(tStartStop2.GetValueOrDefault()):range.Start);
}
其他的
{
arg_ED_1=新的TStartStop?(TStartStop.GetValueOrDefault());
}
tStartStop=Tools.Min(this.Stop,range.Stop);
TStartStop?arg_ED_2;
如果(!tStartStop.HasValue)
{
TStartStop?tStartStop2=此.Stop;
arg_ED_2=(tStartStop2.HasValue?new TStartStop?(tStartStop2.GetValueOrDefault()):range.Stop);
}
其他的
{
arg_ED_2=新的TStartStop?(TStartStop.GetValueOrDefault());
}
结果=arg_ED_0。从StartStop开始(arg_ED_1,arg_ED_2);
}
返回结果;
}
我在这里没有测试什么
添加:IntRange继承自TRange,但不添加任何新内容。您能否澄清“38个块中的36个块”的含义?还有,哪些块(据称)没有被覆盖?我不确定您是否熟悉Visual Studio中的代码覆盖机制?这将告诉您有多少块和线被发现,以及一些其他数据。我看不出哪些街区没有盖上。所有的行都被覆盖了,但是显然有些编译的代码没有被命中。我正试图弄清楚如何完全覆盖这些代码。对不起,我对VS代码覆盖特性只是略知一二。您的代码中有迭代器块吗?我知道迭代器块因其编译器生成的代码而导致代码覆盖工具出错而臭名昭著。我对此很熟悉是的。但正如您在上面看到的,我的代码不包含任何迭代器块。我的猜测是,它与三元运算符表达式有关;我认为并不是所有的组合都在我的单元测试中使用,但我无法发现。