我正在使用 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)
发生这种情况是由于MsTest 2.2.4 中未记录的重大更改DynamicData
,该更改更改了在测试发现期间而不是在测试执行期间发现 ITestDataSource 测试用例(即包括 )的默认行为。
要恢复以前的行为,请升级到 MsTest 2.2.6 或更高版本,并添加以下程序集属性:
[assembly: TestDataSourceDiscovery(TestDataSourceDiscoveryOption.DuringExecution)]
Run Code Online (Sandbox Code Playgroud)