在.Net核心单元测试项目中使用MSTest。我正在尝试使用csv数据源来为测试方法提供数据。
以前,我会在.Net Framework测试项目中使用类似下面的内容:
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", @"data.csv", "data#csv", DataAccessMethod.Sequential),
DeploymentItem("data.csv"),
TestMethod]
public void ValuesController_Post()
{
_controller.Post(TestContext.DataRow["body"]);
_valuesRepository.Verify(_ => _.Post(It.IsAny<string>()), Times.Once);
}
这里的关键是TestContext中的DataRow属性。这似乎不存在于TestContext的.Net Core版本中。
我将如何在.Net Core中执行此操作?
答案 0 :(得分:1)
自从转移到aspnet核心以来,我再也无法使用相同的[Datasource(...)]属性来遍历测试数据,因此始终会跳过数据驱动的测试。
您是否考虑过使用具有读取您的文件的自定义源的[DataTestMethod]和[DynamicData]切换到另一种方法?
这是一篇很好的文章:
https://www.meziantou.net/2018/02/05/mstest-v2-data-tests
也许另一种方法是在测试开始时读取整个文件,然后作为一个单一的单元测试遍历数据集?
希望这会有所帮助。
答案 1 :(得分:0)
我花了一个下午的时间来摆弄东西,但我终于找到了解决方案。由于您没有指定您的测试或 CSV 文件,这里是一个我可以开始工作的快速示例。
长话短说,我安装了 CsvHelper NuGet package,因为解析 CSV 非常简单,直到它不是。正如 Carl Verret 指出的那样,您需要使用测试方法上方的 [DynamicData(...)]
属性,然后使用 CsvHelper 解析 CSV。
CSV 文件(Example.csv)
A,B,IsLessThanZero
1,2,FALSE
3,-5,TRUE
重要提示:确保此 CSV 文件包含在您的测试项目中,并且在解决方案资源管理器中 CSV 文件的属性中将“复制到输出目录”设置为“始终”。
CsvHelper 使用的数据传输对象
public class AdditionData
{
public int A { get; set; }
public int B { get; set; }
public bool IsLessThanZero { get; set; }
}
测试班
[TestClass]
public class ExampleTests
{
// HINT: Look in {Your Test Project Folder}\bin\{Configuration}\netcore3.1\FolderYourCsvFileIsIn for the CSV file.
// Change this path to work with your test project folder structure.
private static readonly string DataFilePath = Path.GetDirectoryName(typeof(ExampleTests).Assembly.Location) + @"\FolderYourCsvFileIsIn\Example.csv";
[TestMethod]
[DynamicData(nameof(GetData), DynamicDataSourceType.Method)]
public void AddingTwoNumbers(AdditionData data)
{
bool isLessThanZero = data.A + data.B < 0;
Assert.AreEqual(data.IsLessThanZero, isLessThanZero);
}
private static IEnumerable<object[]> GetData()
{
using var stream = new StreamReader(DataFilePath);
using var reader = new CsvReader(stream, new CsvConfiguration(CultureInfo.CurrentCulture));
var rows = reader.GetRecords<AdditionData>();
foreach (var row in rows)
{
yield return new object[] { row };
}
}
}
构建解决方案后,您将在测试资源管理器中看到一个测试。运行此单个测试会运行 CSV 文件中定义的所有变体: