使用 MSTest DynamicData 时测试数据“消失”

hea*_*ath 5 c# mstest

我正在使用 VS 2022,并且有一个针对框架 4.5 到 .net 6 的 ac# 库。我有一个针对该库的 MS 测试项目。我大量使用动态数据,最近注意到并非所有测试数据都出现在测试结果中。我已将令人讨厌的问题分解为尽可能小的问题,以证明我所看到的内容。

如果我在 HasExpectedItems2() 中放置一个断点并调试测试,我会看到它达到了 3x,索引分别为 0、1、2,正如我所期望的那样。但是,如果我在 HasExpectedItems1() 中放置一个断点并调试测试,它只会命中 2x,并且 items 分别包含 3 个项目和 null。我没有看到项目包含 0 个项目,这应该是数据行之一。如果我注释掉 DumbItems 中的第三个列表(其中包含 3 个对象),HasExpectedItems1() 仍然会命中 2x,并且 items 包含 0 个项目,并且分别为 null,如预期的那样。所以它看起来有一个填充列表,它以某种方式忽略了空列表。几天来我一直在试图解决这个问题,但我对这里发生的事情感到完全困惑。

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Microsoft.VisualStudio.TestTools.UnitTesting;
#if NET45_OR_GREATER
using System.Web.Mvc;
#elif NETCOREAPP3_0_OR_GREATER
using Microsoft.AspNetCore.Mvc.Rendering;
#endif

[TestClass]
[ExcludeFromCodeCoverage]
public class StaticTestingUnitTests
{
    protected static readonly IEnumerable<SelectListItem>[] DumbItems = new IEnumerable<SelectListItem>[]
    {
        null,
        new List<SelectListItem>(),
        new List<SelectListItem>
        {
            new SelectListItem { Text = "One", Value = "1" },
            new SelectListItem { Text = "Two", Value = "2" },
            new SelectListItem { Text = "Three", Value = "3" },
        },
    };

    protected static IEnumerable<object[]> GetDumbTest1()
    {
        foreach (object item in DumbItems)
        {
            yield return new object[] { item };
        }
    }

    protected static IEnumerable<object[]> GetDumbTest2()
    {
        for (int i = 0; i < DumbItems.Length; i++)
        {
            yield return new object[] { i };
        }
    }

    [DataTestMethod]
    [DynamicData(nameof(GetDumbTest1), DynamicDataSourceType.Method)]
    public void HasExpectedItems1(IEnumerable<SelectListItem> items)
    {
        Assert.AreEqual(5, 5);
    }

    [DataTestMethod]
    [DynamicData(nameof(GetDumbTest2), DynamicDataSourceType.Method)]
    public void HasExpectedItems2(int index)
    {
        Assert.AreEqual(5, 5);
    }
}
Run Code Online (Sandbox Code Playgroud)

cxc*_*ced 9

发生这种情况是由于MsTest 2.2.4 中未记录的重大更改DynamicData,该更改更改了在测试发现期间而不是在测试执行期间发现 ITestDataSource 测试用例(即包括 )的默认行为。

要恢复以前的行为,请升级到 MsTest 2.2.6 或更高版本,并添加以下程序集属性:

[assembly: TestDataSourceDiscovery(TestDataSourceDiscoveryOption.DuringExecution)]
Run Code Online (Sandbox Code Playgroud)