使用 ImmutableList 时,DynamicData 未按预期工作

DynamicData not working as expected when using an ImmutableList

提问人:stefan.at.kotlin 提问时间:11/5/2023 最后编辑:marc_sstefan.at.kotlin 更新时间:11/5/2023 访问量:44

问:

请考虑以下代码:

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)。

我真的想不通为什么只有零项目。请注意,我什至如何使用相同的代码在我的方法中实例化它,以及如何通过测试,而没有。myListSandboxsameListInstantiatedHere.Count.Should().Be(2);myList.Count.Should().Be(2);

为什么?我做错了什么?

C# MSTest 不可变列表

评论


答:

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)
1赞 Ed'ka 11/6/2023
不可以,集合不可序列化Immutable*