3

私にはどうしても解けない謎があります。非常に単純なカスタム属性を使用するこの非常に単純な単体テストがあります。属性は、インスタンス化さえされていない 1 つのクラスにのみ追加されます。属性が構築される回数を数えます。クラス MyDummyClass に設定された属性のために、私は一度期待します。しかし、何らかの理由で単体テストの結果は 2 になります。それをクラスに 2 回追加すると、結果は 4 になります。それを MyTestClass に追加すると、6 増加し、MyTest に追加すると、さらに 13 増加します。したがって、MyDummyClass、MyTestClass、および MyTest に属性があると、カウントは 21 になります。

私が行ったいくつかの追加のテスト:
- コンソール アプリでこれを試すと、期待どおりに動作し、結果は 1 になります。
- MsTest プロジェクトでこれを行い、VS MsTest ランナーを使用すると、結果は 1 になります
。 NUnit 独自のビューアー (2.0 フレームワーク) または resharper のコードは 21 です。
- 注意: resharper で MsTest テストを実行すると、結果は 2 です。

VS2010 ビルド 10.0.40219.1、Resharper v6.1.1000.82、NUnit 2.5.10 (R# 提供) を使用しています。

テストしてみませんか?コードは次のとおりです。

using System;
using NUnit.Framework;

namespace MyTests
{
    [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
    public class WtfAttribute : Attribute
    {
        public static int CallCount = 0;

        public WtfAttribute() //every time the attribute is constructed the count is incremented by 1.
        {
            CallCount++;
        }
    }

    //this class is NEVER instantiated, but adding the attribute to it increases the callcount by 2. I expected it to be 1 due to reflection.
    [Wtf]
    public class MyDummyClass
    {
    }

    [TestFixture]
    //adding the attribute to MyTestClass increases the callcount by 6.
    //[Wtf]
    public class MyTestClass
    {
        [Test]
        //adding the attribute to MyTest increases the callcount by 13.
        //[Wtf]
        public void MyTest()
        {
            Assert.AreEqual(1, WtfAttribute.CallCount, "CallCount = " + WtfAttribute.CallCount);
        }
    }
}

WTFが進行中であることを誰かが理解するのを手伝ってくれることを願っています. CallCount が 1 でないのはなぜですか? 提供されたヘルプとコメントに感謝します。

よろしく、テッド

4

1 に答える 1

5

その理由は、単体テスト フレームワークがリフレクションを使用してアセンブリを検査し、すべてのアセンブリ、型、およびメソッドのカスタム属性を照会するためです。

これを行う (つまり、 を呼び出すGetCustomAttributes()) と、その呼び出しの結果として属性を返すことができるように、属性が構築されます。

単体テスト フレームワークは、このタイプのリフレクションを複数回行っていると思います。

于 2013-05-29T13:24:05.510 に答える