提问人:stefan.at.kotlin 提问时间:11/5/2023 最后编辑:marc_sstefan.at.kotlin 更新时间:11/5/2023 访问量:44
使用 ImmutableList 时,DynamicData 未按预期工作
DynamicData not working as expected when using an ImmutableList
问:
请考虑以下代码:
public static IEnumerable<object[]> TestData
{
get
{
yield return new object[]
{
"hello",
ImmutableList<string>.Empty.AddRange(
new List<string>()
{
"one",
"two"
}
)
};
}
}
[TestMethod]
[DynamicData(nameof(TestData))]
public void Sandbox(string myString, ImmutableList<string> myList)
{
var sameListInstantiatedHere = ImmutableList<string>.Empty.AddRange(
new List<string>()
{
"one",
"two"
}
);
sameListInstantiatedHere.Count.Should().Be(2);
myString.Should().Be("hello");
myList.Count.Should().Be(2);
}
我收到此错误:
预期 myList.Count 为 2,但发现 0(相差 -2)。
我真的想不通为什么只有零项目。请注意,我什至如何使用相同的代码在我的方法中实例化它,以及如何通过测试,而没有。myList
Sandbox
sameListInstantiatedHere.Count.Should().Be(2);
myList.Count.Should().Be(2);
为什么?我做错了什么?
答:
2赞
Ed'ka
11/5/2023
#1
确实非常意外的行为,可以通过应用此属性来修复:
[assembly: TestDataSourceDiscovery(TestDataSourceDiscoveryOption.DuringExecution)]
似乎这种行为是由 2.2.6 中引入的 MSTest 发现机制更改引起的,默认情况下(没有上述属性)要求测试用例数据是可序列化的,这似乎是这里的罪魁祸首(注意:它确实按预期工作,但不是)。List<>
ImmutableList<>
修复它的另一种方法是切换到 xUnit,它确实可以按预期开箱即用:
public class UnitTest
{
public static IEnumerable<object[]> TestData
{
get
{
yield return new object[]
{
"hello",
ImmutableList.Create("one", "two")
};
}
}
[Theory]
[MemberData(nameof(TestData))]
public void Sandbox(string myString, ImmutableList<string> myList)
{
myString.Should().Be("hello");
myList.Count.Should().Be(2);
}
}
评论
0赞
stefan.at.kotlin
11/5/2023
谢谢,使用 worked,但作为副作用,这不会为每个动态数据测试值提供单个“子条目”。我切换到列表来解决这个问题。您知道如何检查类是否可序列化吗?想知道 ImmutableList 是否真的不支持序列化。顺便说一句,很棒的 XUnit 示例,但与 MSTest 上的 DuringExecution 相同的问题:当具有多个收益返回时,没有单个“子条目”。(对于子条目,我的意思是这个 -> stackoverflow.com/questions/76982547/......DuringExecution
)
评论