遍历使用 yield 的 IEnumerable
Iterate through an IEnumerable that uses yield
我已经开始对我的系统进行单元测试,并进行了一系列测试(使用 Xunit),使用以下 TestData(),一次一个向量:
public static IEnumerable<object[]> TestData()
{
yield return new object[] { true, false };
yield return new object[] { false, false };
yield return new object[] { true, true };
yield return new object[] { false, true };
}
现在我想知道是否有办法在 same/single 测试中(重新)使用整个集合。
例如,这是我要设置的测试:
[Theory]
public void CanCheckAllInOneGo()
{
bool error = false;
// The foreach does not work
foreach (var a in TestData())
{
error |= doSomething(a[0], a[1]);
}
Assert.True(error != true, "doSomething() failed");
}
注意,为了一次运行一个向量,我之前使用了以下属性:
[Theory]
[MemberData(nameof(TestData))]
可能因为“yield”的缘故不可能吧。如果没有,你会怎么做?谢谢
如果你想要参数化测试,你应该像这样使用 InlineData 属性:
[Theory]
[InlineData(true, false)]
[InlineData(false, false)]
[InlineData(true, true)]
[InlineData(false, true)]
public void CanCheckAllInOneGo(bool value1, bool value2)
{
Assert.True(doSomething(value1, value2), "doSomething() failed");
}
该文章还解释了如何使用 MemberData 属性来重用测试数据。
[Theory]
[MemberData(nameof(TestData))]
public void CanCheckAllInOneGo(bool value1, bool value2)
{
Assert.True(doSomething(value1, value2), "doSomething() failed");
}
public static IEnumerable<object[]> TestData()
{
yield return new object[] { true, false };
yield return new object[] { false, false };
yield return new object[] { true, true };
yield return new object[] { false, true };
}
如果您真的想在 [Fact] 测试中使用 TestData 生成器,那么您走对了,您只是忘记了将对象转换回布尔值:
[Fact]
public void CanCheckAllInOneGo()
{
varerror = false;
foreach (var a in TestData())
{
error |= doSomething((bool)a[0], (bool)a[1]);
}
Assert.True(error != true, "doSomething() failed");
}
如果你想使用一个IEnumerable<_>
,你不妨使用适当的类型:
public static IEnumerable<Tuple<bool, bool>> TestData()
{
yield return new Tuple<bool, bool>(true, false);
yield return new Tuple<bool, bool>(false, false);
yield return new Tuple<bool, bool>(true, true);
yield return new Tuple<bool, bool>(false, true);
}
[Theory]
public void CanCheckAllInOneGo()
{
foreach (var a in TestData())
{
var error = doSomething(a.Item1, a.Item2);
Assert.False(error, "doSomething() failed");
}
}
如果需要 object[]
,那么您将需要进行一些转换。
public static IEnumerable<object[]> TestData()
{
yield return new object[] { true, false };
yield return new object[] { false, false };
yield return new object[] { true, true };
yield return new object[] { false, true };
}
[Theory]
public void CanCheckAllInOneGo()
{
foreach (var a in TestData())
{
var x = (bool) a[0];
var y = (bool) a[1];
var error = doSomething(x, y);
Assert.False(error, "doSomething() failed");
}
}
我已经开始对我的系统进行单元测试,并进行了一系列测试(使用 Xunit),使用以下 TestData(),一次一个向量:
public static IEnumerable<object[]> TestData()
{
yield return new object[] { true, false };
yield return new object[] { false, false };
yield return new object[] { true, true };
yield return new object[] { false, true };
}
现在我想知道是否有办法在 same/single 测试中(重新)使用整个集合。
例如,这是我要设置的测试:
[Theory]
public void CanCheckAllInOneGo()
{
bool error = false;
// The foreach does not work
foreach (var a in TestData())
{
error |= doSomething(a[0], a[1]);
}
Assert.True(error != true, "doSomething() failed");
}
注意,为了一次运行一个向量,我之前使用了以下属性:
[Theory]
[MemberData(nameof(TestData))]
可能因为“yield”的缘故不可能吧。如果没有,你会怎么做?谢谢
如果你想要参数化测试,你应该像这样使用 InlineData 属性:
[Theory]
[InlineData(true, false)]
[InlineData(false, false)]
[InlineData(true, true)]
[InlineData(false, true)]
public void CanCheckAllInOneGo(bool value1, bool value2)
{
Assert.True(doSomething(value1, value2), "doSomething() failed");
}
该文章还解释了如何使用 MemberData 属性来重用测试数据。
[Theory]
[MemberData(nameof(TestData))]
public void CanCheckAllInOneGo(bool value1, bool value2)
{
Assert.True(doSomething(value1, value2), "doSomething() failed");
}
public static IEnumerable<object[]> TestData()
{
yield return new object[] { true, false };
yield return new object[] { false, false };
yield return new object[] { true, true };
yield return new object[] { false, true };
}
如果您真的想在 [Fact] 测试中使用 TestData 生成器,那么您走对了,您只是忘记了将对象转换回布尔值:
[Fact]
public void CanCheckAllInOneGo()
{
varerror = false;
foreach (var a in TestData())
{
error |= doSomething((bool)a[0], (bool)a[1]);
}
Assert.True(error != true, "doSomething() failed");
}
如果你想使用一个IEnumerable<_>
,你不妨使用适当的类型:
public static IEnumerable<Tuple<bool, bool>> TestData()
{
yield return new Tuple<bool, bool>(true, false);
yield return new Tuple<bool, bool>(false, false);
yield return new Tuple<bool, bool>(true, true);
yield return new Tuple<bool, bool>(false, true);
}
[Theory]
public void CanCheckAllInOneGo()
{
foreach (var a in TestData())
{
var error = doSomething(a.Item1, a.Item2);
Assert.False(error, "doSomething() failed");
}
}
如果需要 object[]
,那么您将需要进行一些转换。
public static IEnumerable<object[]> TestData()
{
yield return new object[] { true, false };
yield return new object[] { false, false };
yield return new object[] { true, true };
yield return new object[] { false, true };
}
[Theory]
public void CanCheckAllInOneGo()
{
foreach (var a in TestData())
{
var x = (bool) a[0];
var y = (bool) a[1];
var error = doSomething(x, y);
Assert.False(error, "doSomething() failed");
}
}