2

私は自分の貧乏人のテストフレームワークを書いています。私のコンソールアプリケーションには、次のものがあります。

  static void Main(string[] args)
  {     // Line 12
     double adouble = 77;
     double expected = 70;
     TestingFramework.assertEquals<double>(expected, adouble - 7);  // Line 15
     TestingFramework.assertEquals<double>(expected, adouble - 6);  // Line 16
   }

TestingFramework内に、次の行があります。

System.Console.WriteLine("Success, File {0}, Line {1}", 
   new System.Diagnostics.StackTrace(true).GetFrame(1).GetFileName(), 
   new System.Diagnostics.StackTrace(true).GetFrame(1).GetFileLineNumber());

しかし、テストを実行すると、両方の関数呼び出しでFileLineNumberが12であることがわかります。さらに、正しいファイル名が表示されるので、正しいフレームを参照していると思います。

誰かが、オープンパレンの行番号(12)ではなく、通話を発信した行番号(15、16)を報告する方法を教えてもらえますか?

ありがとう。

4

2 に答える 2

1

私のコメントに追加すると、次のようになります。

    foreach(var frame in StackTrace.GetFrames())
    { 
        System.Reflection.MethodBase method = frame.GetMethod ( );
        Type type = method.DeclaringType;
        // If this is what I am looking for
        if ( type.IsSubclassOf( typeof(TestClassBase)) ||  type != typeof ( TestClassBase) )
        {
            System.Console.WriteLine("Success, File {0}, Line {1}", frame.GetFileName(), frame.GetFileLineNumber());
            return;
        }
    }
于 2012-05-11T23:59:30.783 に答える
0

問題とその修正方法を理解しました。

TestingFramework で assertequals 関数をオーバーロードしました: 1) assertEquals(T expectedValue, T actualValue) および 2) assertEquals(T expectedValue, T actualValue, string comment)。

クライアント コードが 2-param 関数を呼び出すと、その関数は 3-param 関数を呼び出すだけです。この異なるフレームの深さは、それがどのように呼び出されたかによって異なります。

だから私は追加しなければならなかった

static int depth; 

関数に入るときにインクリメントし、終了するときにデクリメントします。これにより、コードが次のように変更されます。

new System.Diagnostics.StackTrace(true).GetFrame(depth).GetFileLineNumber()); 

そしてそれは今動作します。

于 2012-05-13T23:15:25.300 に答える