让 ClassData 从 IEnumerable<object[] 中选取前 n 个元素>



给定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);
}

相关内容

  • 没有找到相关文章

最新更新