2012-05-11 15 views
1

私は自分の貧しい人のテストフレームワークを書いています。私のコンソールアプリケーションでは、私はこれを持っている:TestingFramework以内StackTraceから正しい行番号を取得するにはどうすればよいですか?

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 
    } 

私はこのラインがあります。

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であること、それが私に語りました。さらに、それは私に正しいファイル名を与えるので、私はそれが正しいフレームを参照していると思います。

誰かが私に電話番号(15と16)を発信し、開いているparen(12)の回線番号ではないことを報告する方法を教えてもらえますか?

ありがとうございました。私はこの問題を考え出した

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; 
     } 
    } 
+0

特定の種類のクラスまたは識別子のあるものを探してスタックを歩くことができます。メソッドとその所有者を見てフレームをループするか?ただの考え –

+0

@ハンスパッサント:私のタイトルを改善してくれてありがとう。 – philologon

答えて

0

とどのようにそれを修正する方法:

1

このように、私のコメントに何かを追加は。

私はTestingFrameworkでのassertEquals関数をオーバーロードしていた: 1)のassertEquals(TのexpectedValue、T実際の値)と 2)のassertEquals(TのexpectedValue、T実際の値、文字列のコメント)。

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

は、だから私は、終了時の機能とデクリメントに入るとき、私はインクリメント

static int depth; 

を追加する必要がありました。これにより、コードが次のように変更されます。

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

これで機能します。

+0

あなたの回答にはどこに行番号がありますか? – philologon

+0

@philologon:彼は、自分が探しているクラスに属するものとして識別するスタックフレームから行番号を得ることができます。 –