2010-12-03 2 views
23

Ich möchteWie wird DateTime als ValuesAttribute zum Komponententest festgelegt?

Ein Attribut Argument etwas wie diese Parameter in Bezug auf die folgende Fehlermeldung erhalten, aber ich

[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); 
} 

zu tun, muss ein konstanter Ausdruck, typeof Ausdruck oder Array-Erstellung Ausdruck eines

sein

Irgendwelche Vorschläge?


UPDATE: netten Artikel über Parametrisierte Tests in NUnit 2,5
http://www.pgs-soft.com/new-features-in-nunit-2-5-part-1-parameterized-tests.html

Antwort

25

Eine Alternative zum Aufblähen des Komponententests besteht darin, die Erstellung der TestCaseData mithilfe des TestCaseSource-Attributs zu entladen.

Mit dem Attribut TestCaseSource können Sie eine Methode in einer Klasse definieren, die von NUnit aufgerufen wird, und die in der Methode erstellten Daten werden an Ihren Testfall übergeben.

Diese Funktion ist in NUnit 2.5 zur Verfügung und Sie können mehr here lernen ...

[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

ein benutzerdefiniertes Attribut definieren, die sechs Parameter akzeptiert und dann verwenden, wie

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

und dann bauen die notwendige Instanzen von DateTime entsprechend.

Oder Sie könnten

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

tun, wie das könnte ein wenig besser lesbar und wartbar sein.

Wie die Fehlermeldung besagt, dürfen Attributwerte nicht nicht konstant sein (sie sind in die Metadaten der Assembly eingebettet). Entgegen dem Aussehen ist new DateTime(2010, 12, 1) kein konstanter Ausdruck.

15

einfach die Daten als String-Konstanten übergeben und in Ihrem Test analysiert. Ein bisschen nervig, aber es ist nur ein Test, also mach dir keine Sorgen zu viel.

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

(Seien Sie vorsichtig mit Ihrem Standort) – AndyM

+0

Schnell und schmutzig, aber ich mag es. – openshac

Verwandte Themen