强制ClassInitialize在读取testmethod数据之前执行

我在unit testing中评估属性后执行unit testing的classinitilalize方法时遇到问题。 这些测试使用[classinitialize]方法生成一个测试集,该测试集在xml文件中生成一组随机数据。 xml文件由具有[datasource]属性的unit testing使用。 精简版本看起来像这样:

[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来validation执行顺序。 我在每个方法的开头设置了一个断点。 然后我走过去看了文件访问。 我看到的操作顺序。

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

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

MSTestHacks可能是一种可能的解决方法。

它允许测试类上的IEnumberable用作TestMethodDataSource 。 您可以在此属性中返回您拥有的Codes

来自网站:

运行时数据源

您必须从TestBaseinheritance您的测试类

 [TestClass] public class UnitTest1 : TestBase { } 

创建一个返回IEnumerable的Property,Field或Method

 [TestClass] public class UnitTest1 : TestBase { private IEnumerable Stuff { get { //This could do anything, fetch a dynamic list from anywhere.... return new List { 1, 2, 3 }; } } } 

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

 [TestMethod] [DataSource("Namespace.UnitTest1.Stuff")] public void TestMethod1() { var number = this.TestContext.GetRuntimeDataSourceObject(); Assert.IsNotNull(number); }