Pruebas controladas por datos generadas en ClassInitialize: ya no funcionan en Visual Studio 2012

He actualizado de Visual Studio 2010 a Visual Studio 2012.

En mi proyecto de prueba de unidad, tengo un método [ClassInitialize] que genera un archivo CSV que luego introduzco en un [TestMethod] controlado por datos utilizando [DataSource] conectado al CSV.

Esto funciona muy bien en Visual Studio 2010.

No puedo conseguir que esto funcione en Visual Studio 2012.

Parece que en VS2012 el corredor de prueba de MS requiere que el archivo conectado a [DataSource] ya exista, de lo contrario no se ejecutará ninguna de las pruebas. Si yo mismo creo el CSV, las pruebas controladas por datos se ejecutan, pero no recogen los datos creados en [ClassInitialize]: parece que la lista de pruebas de [DataSource] se evalúa ANTES de que se ejecute [ClassInitialize].

¿Hay una solución?

Este es un proyecto mínimo que reproduce el problema. Para mí, esto tiene éxito en VS2010 pero falla en VS2012.

TestProject.cs

using System.Diagnostics;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject
{
    [TestClass]
    public class DataDrivenUnitTest
    {
        private static bool _classInitializeCalled;
        private static int _testCount;

        public TestContext TestContext { get; set; }

        [ClassInitialize]
        public static void ClassInitialize(TestContext testContext)
        {
            // Generate the csv list of tests
            //TestContext = testContext;
            _classInitializeCalled = true;
            string testDirectory;
            testDirectory = testContext.DeploymentDirectory;
            using (var f = new StreamWriter(testDirectory + @"\" + "TestList.csv"))
            {
                f.WriteLine("TestName");
                f.WriteLine("TestA");
                f.WriteLine("TestB");
            }
        }

        [TestMethod]
        [DataSource("CsvTestData32")]
        public void TestMethod1()
        {
            _testCount++;
            var testName = TestContext.DataRow["TestName"];
            Debug.Print("Test {0}: {1}", _testCount, testName);
        }

        [ClassCleanup]
        public static void ClassCleanup()
        {
            Assert.IsTrue(_classInitializeCalled);
            Assert.AreEqual(_testCount, 2);
            Debug.Print("Tests completed: Tests run {0}", _testCount);
        }
    }
}

En mi caso, la configuración predeterminada es "Ejecutar prueba como 32 bits". esto puede ser cambiado bajo

en VS2012: PRUEBA> Configuración de prueba> Arquitectura predeterminada del procesadoren VS2010 Haga clic con el botón derecho en Explorador de soluciones 'Elementos de solución'> Agregar> Nuevo elemento> Configuración de prueba, luego,Menú principal del VS2010> Pruebas> Editar configuración de prueba> Hosts> Ejecutar pruebas en un proceso de 32 o 64 bits.

Si usa 64 bits, use [DataSource ("CsvTestData64")], y es posible que deba instalar elControlador ODBC de MS Access de 64 bits. La forma más fácil es quedarse con 32 bits.

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>

  <microsoft.visualstudio.testtools>
    <dataSources>
      <add name="CsvTestData32" connectionString="CsvConn32" dataTableName="`TestList.csv`" dataAccessMethod="Sequential" />
      <add name="CsvTestData64" connectionString="CsvConn64" dataTableName="`TestTest.csv`" dataAccessMethod="Sequential" />
    </dataSources>
  </microsoft.visualstudio.testtools>

  <connectionStrings>
    <add name="CsvConn32" connectionString="Driver={Microsoft Text Driver (*.txt; *.csv)};.\;Extensions=csv;" providerName="System.Data.Odbc" />
    <add name="CsvConn64" connectionString="Driver={Microsoft Access Text Driver (*.txt, *.csv)};Dbq=.\;Extensions=csv" providerName="System.Data.Odbc" />
  </connectionStrings>
</configuration>

Respuestas a la pregunta(1)

Su respuesta a la pregunta