C# 有没有一种方法可以使用';内存中已存在用于驱动单元测试的?

C# 有没有一种方法可以使用';内存中已存在用于驱动单元测试的?,c#,visual-studio-2010,mstest,data-driven-tests,C#,Visual Studio 2010,Mstest,Data Driven Tests,我知道我可以使用文件中的数据来驱动单元测试,例如csv或xml文件中的数据 例如: [TestMethod] [DataSource( "Microsoft.VisualStudio.TestTools.DataSource.CSV", "Data.csv", "Data#csv", DataAccessMethod.Sequential)] public void TestData() {} 我想知道是否有一种方法,可以使用内存中已有的数据结构来驱动测试

我知道我可以使用文件中的数据来驱动单元测试,例如csv或xml文件中的数据

例如:

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)]
public void TestData() {}
我想知道是否有一种方法,可以使用内存中已有的数据结构来驱动测试,而不是使用文件

比如:

// this structure has the data to use in the unit test
var DataList = new List<string>();

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.IEnumerable",
    "DataList", 
    "DataList", 
    DataAccessMethod.Sequential)]
public void TestData() {}
//此结构具有用于单元测试的数据
var DataList=新列表();
[测试方法]
[数据源(
“Microsoft.VisualStudio.TestTools.DataSource.IEnumerable”,
“数据列表”,
“数据列表”,
DataAccessMethod.Sequential)]
public void TestData(){}

一个简单的解决方案是

private void TestData(IEnumerable what ) { ... your test method ... }

[TestMethod]
public void TestDataInMemory() { List<T> mylist = ...; this.TestData(mylist); }

[TestMethod]
[DataSource(
    "Microsoft.VisualStudio.TestTools.DataSource.CSV", 
    "Data.csv", 
    "Data#csv", 
    DataAccessMethod.Sequential)]
public void TestData() { this.TestData(testContextInstance ...) }
private void TestData(IEnumerable what){…您的测试方法…}
[测试方法]
public void TestDataInMemory(){List mylist=…;this.TestData(mylist);}
[测试方法]
[数据源(
“Microsoft.VisualStudio.TestTools.DataSource.CSV”,
“Data.csv”,
“数据#csv”,
DataAccessMethod.Sequential)]
public void TestData(){this.TestData(testContextInstance…)}

通过这种方式,您可以对从文件加载的数据和从内存加载的数据使用您的测试方法。

我不认为您可以使用
[DataSource]
属性来实现这一点,但您可以手动完成大致相同的操作


[AssemblyInitialize]
[ClassInitialize]
修饰的方法加载数据。然后重写测试以循环数据。不幸的是,这样一来,每次测试运行都会得到一个测试,而不是单独的结果。

如果它在内存中,我的首选是不使用DataSource,而是使用T4模板来自动生成单元测试。这样,您将只编写一次测试,但在测试运行的结果中,您将看到测试的每个输入的条目。将此.tt文件添加到测试项目中

<#@ template debug="false" hostspecific="true" language="C#v3.5" #>
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Linq" #>
<#@ output extension=".cs" #>
<#
        List<string> DataList = AccessInMemoryData();
#>
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject1
{
[TestClass]
public class UnitTest1
{
    <# foreach (string currentTestString in DataList) { #>
    [TestMethod]
    public void TestingString_<#= currentTestString #>
    {
    string currentTestString = "<#= currentTestString #>";
    // TODO: Put your standard test code here which will use the string you created above
    }
    <# } #>
}
}

使用制度;
使用系统文本;
使用System.Collections.Generic;
使用System.Linq;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
命名空间TestProject1
{
[测试类]
公共类UnitTest1
{
[测试方法]
公共无效测试字符串_
{
字符串currentTestString=“”;
//TODO:将您的标准测试代码放在这里,它将使用您在上面创建的字符串
}
}
}

我想应该解决这个问题。我不确定当前项目的状态。

我以前使用的解决方案是从内存中的数据生成一个简单的CSV文件。

您可以使用via NuGet从IEnumerable馈送数据,请参阅。

谢谢您的建议。不幸的是,在我看来,TestDataInMemory()测试将只对任意数量的数据项运行一次,而TestData()测试将对每个项运行一次。出于我的目的,我宁愿每个条目运行一个测试。是的,数据已经在[ClassInitialize]函数中设置好了,我尝试了您的建议。它确实可以工作,但对所有数据进行一次测试意味着断言将在第一次失败的测试中停止该功能。不是我想要的。谢谢你的建议。类似的问题