3

単体テストの属性の評価後に実行される単体テストの classinitilalize メソッドに問題があります。これらのテストは、[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. vstestexecutionengine によって読み取られる TestData.xml。
  2. ClassInitialize メソッドが呼び出され、TestData.xml が書き込まれます
  3. 手順 1 で読み取ったデータを使用して、TestMethod が実行されます (テスト用に偽のデータを含むファイルを追加しました)。

だから私の質問は、xml ファイルが読み込まれる前に classinitialize が実行されていないことは何ですか? それとも私がやろうとしていることは不可能ですか?

4

1 に答える 1

-1

MSTestHacksが回避策になる可能性があります。

これにより、IEnumberableテスト クラスの を の として使用できDataSourceますTestMethodCodesこの物件にあるものはそのまま返却できます。

ウェブサイトから:

ランタイム データソース

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);
}
于 2014-12-18T18:45:13.960 に答える