什么是TestContext.DataRow [" MyColumnName"]的替代品

时间:2017-07-06 15:59:30

标签: c# asp.net-core datasource mstest

在.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中执行此操作?

2 个答案:

答案 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 文件中定义的所有变体:

Screenshot of test explorer showing one test named AddingTwoNumbers