给定xUnit测试项目中的以下模拟数据
public sealed class MockData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { "First", 1 };
yield return new object[] { "Second", 2 };
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
我想用这个类进行两次测试
[Theory]
[ClassData(typeof(MockData))]
private void FirstTest(string foo)
{
Assert.True(true);
}
[Theory]
[ClassData(typeof(MockData))]
private void SecondTest(string foo, int bar)
{
Assert.True(true);
}
但正如您所看到的,第一个测试只接受一个参数。当运行测试时,第一个测试失败,出现以下异常
系统。InvalidOperationException:测试方法需要1个参数值,但提供了2个参数值。
有没有办法让ClassData
从该对象中选择第一列并忽略其余列?
有很多方法可以解决这个问题。我能想到的几个解决方案:
使用成员数据
[Theory]
[MemberData(nameof(MockData.ColumnA), MemberType= typeof(MockData))]
private void ColATest(string foo) => ...
[Theory]
[MemberData(nameof(MockData.ColumnB), MemberType= typeof(MockData))]
private void ColBTest(string foo) => ...
[Theory]
[ClassData(typeof(MockData))]
private void SecondTest(string foo, int bar)
{
Assert.True(true);
}
public sealed class MockData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { "First", 1 };
yield return new object[] { "Second", 2 };
}
public IEnumerable<string> ColumnA => this.Select(x => x[0]);
public IEnumerable<int> ColumnB => this.Select(x => x[1]);
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
向方法添加参数并忽略它:
[Theory]
[ClassData(typeof(MockData))]
private void FirstTest(string foo, int bar)
{
// just don't use 'bar'
Assert.True(true);
}
[Theory]
[ClassData(typeof(MockData))]
private void SecondTest(string foo, int bar)
{
Assert.True(true);
}