1

免责声明:此问题的单元测试相关信息并不真正相关 -如果您不熟悉此问题,可以跳至“问题” ,但它有助于设置上下文。

我有一门课需要进行单元测试。它看起来像这样:

public class NumberParser {
    public static void CheckByteRange(string str){...}
    [...]
    public static void CheckFloatRange(string str){...}
    [...]
}

我想使用 NUnit参数化单元测试来测试所有这些方法。下面是测试方法:

    [TestCaseSource("CheckRange_Overflow_Inputs")]
    public void CheckRange_Overflow(string value, Action<string> method)
    {
        Assert.Throws<Exception>(() => method(value));
    }

测试用于TestCaseSourceAttribute指定一个字段,该字段包含测试方法的参数集列表。

现在,NUnit 需要一个名为CheckRange_Overflow_Inputs,类型为 的字段object[],它本身包含object[]元素,每个元素都包含测试方法参数的值。

问题:

理想情况下,我想这样写字段:

    private static readonly object[] CheckRange_Overflow_Inputs
        = new object[]
              {
                  new object[]{byte.MaxValue,  NumberParser.CheckByteRange },
                  [...]
                  new object[]{float.MaxValue, NumberParser.CheckFloatRange },
                  [...]
              };

但是编译器抱怨它不能将方法组转换为对象。

这是有道理的——NumberParser.CheckByteRange可能是模棱两可的,例如它可能过载。

但是我怎样才能让编译器允许我保存(作为对象)调用的方法,该方法NumberParser.CheckByteRange需要 astring并返回void

我试过的(和失败的成功):

 [...]
 new object[]{byte.MaxValue, (Action<string>)NumberParser.CheckByteRange },
 [...]
4

1 回答 1

4

如果方法是static,那么您的尝试会奏效。它不能简单地工作

(Action<string>)NumberParser.CheckByteRange

whenCheckByteRange是一个实例(非static)方法,因为您没有告诉它this使用哪个实例()。所以要么:

  • 做成方法CheckByteRange_static
  • 告诉它使用哪个实例,即(Action<string>)someInstance.CheckByteRange

有了他们static,以下对我来说编译得很好:

private static readonly object[] CheckRange_Overflow_Inputs
    = new object[]
          {
              new object[]{byte.MaxValue,  (Action<string>) NumberParser.CheckByteRange },
              new object[]{float.MaxValue, (Action<string>) NumberParser.CheckFloatRange },
          };
于 2013-05-21T09:41:01.130 回答