如何使用多个数据源运行单元测试?

Dou*_*oum 5 c# unit-testing mstest datasource data-driven-tests

我找不到在使用不同DataSource同一测试类中运行不同单元测试的方法.

以下是测试类的示例:

  namespace Calc.Tests
  {
     [TestClass]
     public class CalcTests
     {
        private static TestContext Context { get; set; }

        [ClassInitialize]
        public static void ClassInitialize(TestContext context)
        {
           Context = context;
        }

        [TestMethod]
        [DeploymentItem("AddedValues.csv")]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", @"|DataDirectory|\AddedValues.csv", "AddedValues#csv", DataAccessMethod.Sequential)]
        public void Add_UsingValuesWithinCsv()
        {
           Calc calc = new Calc();

           // Arrange
           int firstValue = Convert.ToInt32(Context.DataRow["firstValue"]);
           int secondValue = Convert.ToInt32(Context.DataRow["secondValue"]);
           int expectedResult = Convert.ToInt32(Context.DataRow["expectedResult"]);

           // Act
           int result = calc.Add(firstValue, secondValue);

           // Assert
           Assert.AreEqual<int>(result, expectedResult);
        }

        [TestMethod]
        [DeploymentItem("AddedValues.xml")]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", @"|DataDirectory|\AddedValues.xml", "TestCase", DataAccessMethod.Sequential)]
        public void Add_UsingValuesWithinXml()
        {
           Calc calc = new Calc();

           // Arrange
           int firstValue = Convert.ToInt32(Context.DataRow["firstValue"]);
           int secondValue = Convert.ToInt32(Context.DataRow["secondValue"]);
           int expectedResult = Convert.ToInt32(Context.DataRow["expectedResult"]);

           // Act
           int result = calc.Add(firstValue, secondValue);

           // Assert
           Assert.AreEqual<int>(result, expectedResult);
        }
     }
  }
Run Code Online (Sandbox Code Playgroud)

如果我使用xml中的数据运行单元测试,一切运行正常.

如果我使用来自csv的数据运行单元测试,那么eveything运行正常.

如果我在测试类中运行所有测试,则第二个单元测试运行将以错误结束.

有没有办法确保在每次单元测试之前重置DataSource?

我看过TestCleanup和TestInitialize,但没有发现任何事情......

Dou*_*oum 2

我得到了它!

我误解了 TestContext 的使用,尽管我必须在 ClassInitialize 方法中进行初始化。

因为我将 ClassInitialized 设置为静态,所以我也需要将 TestContext 设置为静态,并且 TestContext 仅在 ClassInitialize 处初始化一次。

根据 MSDN 文档,我的 TestContext 属性需要是一个实例属性,MSTest 会自动为我提供 TestContext。 http://msdn.microsoft.com/en-us/library/ms404699(v=vs.80).aspx

这样做,使我的 TestContext.DataRow 可以与作为 TestMethod 属性提供的 DataSource 一起正常工作。

希望有一天这可以帮助某人!