强制 ClassInitialize 在读取测试方法数据之前执行

问题描述 投票:0回答:1

我在单元测试的属性评估后执行单元测试的 classinitialize 方法时遇到问题。这些测试使用 [classinitialize] 方法生成一个测试集,该测试集在 xml 文件中生成一组随机数据。 xml 文件由具有属性 [datasource] 的单元测试使用。其精简版本如下所示:

[ClassInitialize]
public static void Initialize(TestContext context)
{
    // Create xml output file
    var output = new XDocument(new XElement("Rows"));

    foreach (var Code in Codes)
    {
        if (output.Root != null) 
            output.Root.Add(new XElement("Row", new XElement("Code", Code)));
    }
    output.Save("TestData.xml");
}

[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
"|DataDirectory|\\TestData.xml",
"Row",
DataAccessMethod.Sequential)]
[TestMethod]
public void TestStuff()
{
    var Code = (string)TestContext.DataRow["Code"];
    TestItem(Code);
}

我正在使用 Visual Studio 2012 Update 3。我使用了 Sysinternals 工具 Process Monitor 来验证执行顺序。我在每个方法的开头设置了一个断点。然后我逐步查看文件访问情况。我看到的操作顺序。

  1. TestData.xml 由 vstestexecutionengine 读取。
  2. 调用ClassInitialize方法并写入TestData.xml
  3. 使用步骤1中读取的数据执行TestMethod。(我添加了一个包含虚假数据的文件来测试)

所以我的问题是,我做错了什么,在读取 xml 文件之前 classinitialize 没有执行?或者我想做的事情是不可能的?

c# visual-studio-2012 mstest
1个回答
-1
投票

MSTestHacks 可能是您的一个可能的解决方法。

它允许您的测试类上的

IEnumerable
用作您的
DataSource
TestMethod
。您可以将您在此房产中拥有的
Codes
归还。

来自网站:

运行时数据源:您的测试类必须继承自

TestBase

[TestClass]
public class UnitTest1 : TestBase
{ }

创建返回

IEnumerable

的属性、字段或方法
[TestClass]
public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, fetch a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

DataSource
属性添加到您的测试方法中,指向之前创建的
IEnumerable
名称。这需要完全合格。

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}
© www.soinside.com 2019 - 2024. All rights reserved.