Testy oparte na danych generowane w ClassInitialize: nie działają już w Visual Studio 2012

Zaktualizowałem program Visual Studio 2010 do Visual Studio 2012.

W moim projekcie testu jednostkowego mam metodę [ClassInitialize], która generuje plik CSV, który następnie przesyłam do sterowanego danymi [TestMethod] przy użyciu [DataSource] połączonego z CSV.

To działa świetnie w Visual Studio 2010.

Nie mogę tego uruchomić w Visual Studio 2012.

Wydaje się, że w VS2012 biegacz testowy MS wymaga, aby plik podłączony do [DataSource] już istniał, inaczej żaden test nie zostanie uruchomiony. Jeśli sam tworzę CSV, uruchamiane są testy oparte na danych, ale nie wychwytują danych utworzonych w [ClassInitialize]: wygląda na to, że lista testów z [DataSource] jest oceniana PRZED uruchomieniem [ClassInitialize].

Czy jest w pobliżu praca?

Jest to minimalny projekt, który odtwarza problem. Dla mnie to się udaje w VS2010, ale kończy się niepowodzeniem w 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);
        }
    }
}

W moim przypadku „test uruchamiania jako 32-bitowy” jest ustawieniem domyślnym; można to zmienić pod -

w VS2012: TEST> Ustawienia testowe> Domyślna architektura procesoraw VS2010 Kliknij prawym przyciskiem myszy Eksplorator rozwiązań „Elementy rozwiązania”> Dodaj> Nowy element> Testuj ustawienia, a następnie,VS2010 menu główne> Testy> Edytuj ustawienia testu> Hosty> Uruchom testy w procesie 32-bitowym lub 64-bitowym.

Jeśli używasz 64-bitowego, użyj [DataSource („CsvTestData64”)]] i może być konieczne zainstalowanieSterownik ODBC MS Access 64-bit. Najłatwiej jest trzymać się wersji 32-bitowej.

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>

questionAnswers(1)

yourAnswerToTheQuestion