2010-12-03 4 views
23

私はこのユニットテストにValuesAttributeとしてDateTimeを設定するにはどうすればよいですか?

[Test] 
public void Test([Values(new DateTime(2010, 12, 01), 
         new DateTime(2010, 12, 03))] DateTime from, 
       [Values(new DateTime(2010, 12, 02), 
         new DateTime(2010, 12, 04))] DateTime to) 
{ 
    IList<MyObject> result = MyMethod(from, to); 
    Assert.AreEqual(1, result.Count); 
} 

のような何かをしたいしかし、私は

の発現 または配列の作成表現TYPEOF、パラメータ

属性引数は 定数式でなければなりませんに関する次のエラーを取得します


UPDATE:NUnitの2.5パラメータ化されたテストについての素晴らしい記事
http://www.pgs-soft.com/new-features-in-nunit-2-5-part-1-parameterized-tests.html

答えて

25

単体テストを改善する代わりに、TestCaseSource属性を使用してTestCaseDataの作成をオフロードできます。

TestCaseSource属性を使用すると、NUnitによって呼び出されるクラスにメソッドを定義し、メソッドで作成されたデータがテストケースに渡されます。

この機能は、NUnitの2.5で利用可能で、あなたがhereより多くを学ぶことができます...

[TestFixture] 
public class DateValuesTest 
{ 
    [TestCaseSource(typeof(DateValuesTest), "DateValuesData")] 
    public bool MonthIsDecember(DateTime date) 
    { 
     var month = date.Month; 
     if (month == 12) 
      return true; 
     else 
      return false; 
    } 

    private static IEnumerable DateValuesData() 
    { 
     yield return new TestCaseData(new DateTime(2010, 12, 5)).Returns(true); 
     yield return new TestCaseData(new DateTime(2010, 12, 1)).Returns(true); 
     yield return new TestCaseData(new DateTime(2010, 01, 01)).Returns(false); 
     yield return new TestCaseData(new DateTime(2010, 11, 01)).Returns(false); 
    } 
} 
3

[Values(2010, 12, 1, 2010, 12, 3)] 

としてそれを使用して、構築し、その後6つのパラメータを受け取り、カスタム属性を定義します。必要な場合はDateTimeとなります。

それともそれは少し読みやすくかつ保守かもしれないとして、あなたは

[Values("12/01/2010", "12/03/2010")] 

を行うことができます。

エラーメッセージに示すように、属性値は定数ではありません(アセンブリのメタデータに埋め込まれています)。出現とは対照的に、new DateTime(2010, 12, 1)は定数式ではありません。

15

は単なる文字列定数として日付を渡し、テスト内で解析します。 ちょっと迷惑ですが、それは単なるテストなので、あまり心配しないでください。

[TestCase("1/1/2010")] 
public void mytest(string dateInputAsString) 
{ 
    DateTime dateInput= DateTime.Parse(dateInputAsString); 
    ... 
} 
クイックや汚れ
+5

(ロケールに注意してください) – AndyM

+0

が、私はそれが好きです。 – openshac

関連する問題