我正在编写一个需要检查一些参数的方法,如果验证它们,则返回一个IEnumerable。 E.g。
public static IEnumerable<double> GetEnum(int param)
{
if (!IsValidParameter(param))
{
throw new Exception();
}
while(true)
{
yield return 5.0;
}
}
但是,我相信由于懒惰的评估,当我使用错误的参数运行我的单元测试,但是还没有调用任何IEnumerable方法时,不会抛出异常。
[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
var ie = GetEnum(bad_param);
}
我可以通过在另一个函数(比如Foo)中构建IEnumerable来解决问题,然后检查GetEnum中的参数并调用Foo,但是有没有创建多个函数的解决方案?
干杯,尤尔根
答案 0 :(得分:9)
由于定义了迭代器块,您目前需要两种方法来实现此目的:
public static IEnumerable<double> GetEnum(int param) {
if (!IsValidParameter(param)) {
throw new Exception();
}
return GetEnumCore(param);
}
private static IEnumerable<double> GetEnumCore(int param) {
while(true) {
yield return 5.0;
}
}
只延迟迭代器块(GetEnumCore
); GetEnum
立即运行,执行检查。
答案 1 :(得分:2)
您是否可以使用基础枚举器启动迭代?
[Test]
[ExpectedException(typeof(Exception))]
void Test()
{
var ie = GetEnum(bad_param);
var en = ie.GetEnumerator();
en.MoveNext();
}
答案 2 :(得分:2)
只要你不开始枚举你的方法永远不会被调用。您可以尝试在测试中枚举:
var ie = GetEnum(bad_param).First();