none
UnitTest 时候 string.substring()的Bug RRS feed

  • 问题

  • 现象: [TestMethod]中使用string.substring(bPos, Lenth ), 且参数Lenth 超过字符串长度的时候,跳出了一个莫名其妙的异常,大致意思是说“不能再当前模块中使用费托管代码”。

    重现: string str = "abc"; str.substring( 2, 5)); 观察Debug系统异常。

    期望的正确结果: 收到系统异常,提示字符串截取长度越界。

    2010年4月23日 9:55

答案

  • 你好,

    你可以做个最简单的测试:

    直接在控制台程序中测试SubString,隔离其它影响。

    你会发现会报如下错误:

    Index and length must refer to a location within the string.
    Parameter name: length

    所以不会出现你说的那种情况。可能有其它因素的影响。如你的TestMethod


    Microsoft Online Community Support
    2010年4月26日 6:05
  • 很明显是你的代码的问题,而非 MS 的问题。例如一个非常非常非常简单的测试例子

        /// <summary>
        ///A test for Run
        ///</summary>
        [TestMethod()]
        public void RunTest()
        {
          string str = "abc";
          try
          {
            str.Substring(2, 5);
          }
          catch (Exception ex)
          {
            string error = ex.Message;
          }
    
          //Program.Run();
          Assert.Inconclusive("A method that does not return a value cannot be verified.");
        }
    
    得到的是一个 ArgumentOutOfRangeException, Message 是 Index and length must refer to a location within the string.\r\nParameter name: length
    2010年4月28日 7:28
  • 我昨天特地回家试了,问题不能重现。所以这个应该不是一个 Issue。
    Mark Zhou
    2010年4月28日 10:16

全部回复

  • 你好,

    你可以做个最简单的测试:

    直接在控制台程序中测试SubString,隔离其它影响。

    你会发现会报如下错误:

    Index and length must refer to a location within the string.
    Parameter name: length

    所以不会出现你说的那种情况。可能有其它因素的影响。如你的TestMethod


    Microsoft Online Community Support
    2010年4月26日 6:05
  • 我当然知道正常情况下是提示正确的了。只是想提醒一下MS,在VS2008提供的unitTest中会发生这种真正的内存越界bug.
    2010年4月28日 1:22
  • 很明显是你的代码的问题,而非 MS 的问题。例如一个非常非常非常简单的测试例子

        /// <summary>
        ///A test for Run
        ///</summary>
        [TestMethod()]
        public void RunTest()
        {
          string str = "abc";
          try
          {
            str.Substring(2, 5);
          }
          catch (Exception ex)
          {
            string error = ex.Message;
          }
    
          //Program.Run();
          Assert.Inconclusive("A method that does not return a value cannot be verified.");
        }
    
    得到的是一个 ArgumentOutOfRangeException, Message 是 Index and length must refer to a location within the string.\r\nParameter name: length
    2010年4月28日 7:28
  • 我昨天特地回家试了,问题不能重现。所以这个应该不是一个 Issue。
    Mark Zhou
    2010年4月28日 10:16