我创建了一个 NUnit Theory 来帮助我测试一些代码。被测试的实际代码对于这个问题并不像我用来测试它的数据那么重要。即,24 小时制的小时和分钟。
我以这种方式编写我的夹具是为了利用这些特性并符合 NUnit 2.6 Theory 特性中的限制。特别是,我觉得我必须创建诸如 Hour 和 Minute 之类的类,以解决 Datapoints 按确切类型与参数匹配的特性。
[TestFixture]
public class TimeWindowParserTheoryFixture
{
public class Hour
{
public int Value;
}
public class Minute
{
public int Value;
public string AsString { get { return Value.ToString("00"); } }
}
[Datapoints]
public IEnumerable<Hour> Hours
{
get
{
return Enumerable
.Range(0, 25)
.Select(v => new Hour() { Value = v })
.Union(Enumerable.Repeat((Hour)null, 1));
}
}
[Datapoints]
public IEnumerable<Minute> Minutes
{
get
{
return Enumerable
.Range(0, 60)
.Select(v => new Minute() { Value = v })
.Union(Enumerable.Repeat((Minute)null, 1));
}
}
[Datapoints]
public IEnumerable<string> Separators
{
get { return new[] { " ", "-" }; }
}
[Theory]
public void ValidHours(Hour startHour,
Minute startMinute,
Hour endHour,
Minute endMinute,
string separator)
{
Assume.That(startHour != null);
Assume.That(endHour != null);
var parser = new TimeWindowParser();
var startMinutesString = String.Format("{0}{1}", startMinute == null ? "" : ":", startMinute == null ? "" : startMinute.AsString);
var endMinutesString = String.Format("{0}{1}", endMinute == null ? "" : ":", endMinute == null ? "" : endMinute.AsString);
var pattern = String.Format("{0}{1}{2}{3}{4}{5}{6}", startHour, startMinutesString, "", separator, endHour, endMinutesString, "");
//Console.WriteLine(pattern);
var result = parser.Parse(pattern);
Assert.That(result, Is.Not.Null);
Assert.That(result.Start, Is.EqualTo(startHour));
Assert.That(result.End, Is.EqualTo(endHour));
}
}
我发现在 NUnit 的默认组合逻辑期间生成的数据集的大小导致数据集太大,以至于我的内存不足。我设置测试和数据的方式似乎不是问题,但显然是这样,所以我正在寻求有关如何以不同方式思考这个问题的建议。这是我得到的 OutOfMemoryException 堆栈跟踪。
System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount)
at System.Text.StringBuilder.AppendHelper(String value)
at System.Text.StringBuilder.Append(String value)
at NUnit.Core.MethodHelper.GetDisplayName(MethodInfo method, Object[] arglist)
at NUnit.Core.Builders.NUnitTestCaseBuilder.BuildSingleTestMethod(MethodInfo method, Test parentSuite, ParameterSet parms)
此异常本身很奇怪,因为它似乎是通过简单地尝试获取 Test 方法的名称来生成的(请参阅 GetDisplayName)。我不确定这是否是一个错误(已知或其他)。顺便说一句,当我使用参数化测试中使用的实验性较少的 Range 和 Value 属性重新编写此夹具时,我得到了一个非常相似的 OOM 异常。