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。此外,它给了我正确的文件名,所以我认为它引用了正确的框架。

有人可以告诉我如何让它向我报告发起呼叫的行号(15 然后 16),而不是开放括号​​的行号(12)?

谢谢。

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 回答