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.CheckByteRangestringvoid?

私が試したこと(そして失敗した成功):

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

1 に答える 1

4

メソッドが だった場合、staticあなたの試みは成功したでしょう。単純に機能することはできません

(Action<string>)NumberParser.CheckByteRange

whenは、使用するインスタンス ( ) を指定していないためCheckByteRange、インスタンス (非) メソッドです。したがって、次のいずれかです。staticthis

  • メソッド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 に答える