2016-08-01 31 views
2

Dies ist mein CodeUnit-Tests Körper von Eigenschaften

public class AssistanceRequest : DocumentBase 
{ 
    public AssistanceRequest() 
    { 
     RequestTime = DateTime.Now; 
     ExcecutionTime = DateTime.MaxValue; 
    } 

    public AssistanceRequest(int amount, string description, DateTime? requestTime) : this() 
    { 
     //Check for basic validations 
     if (amount <= 0) 
      throw new Exception("Amount is not Valid"); 
     this.Amount = amount; 
     this.Description = description; 
     this.RequestTime = requestTime ?? DateTime.Now; 
    } 

    private long Amount { get; set; } 

    private DateTime requestTime { get; set; } 

    public DateTime RequestTime 
    { 
     get { return requestTime; } 
     set 
     { 
      if (value != null && value < DateTime.Now) 
       throw new Exception("Request Time is not Allowed"); 
      requestTime = value; 
     } 
    } 

Wie Sie Ich habe eine Validierung in meinem Set Körper sehen kann. Ich muss es testen. und ich versuche, den Konstruktor in meinen Tests aufzurufen. aber ich bekomme Exception in Constructor (act) vor der Assertion. Wie mache ich meine Tests richtig?

Dies ist mein Test:

[Theory] 
    [MemberData("RequestFakeData")] 
    public void Should_Throw_Exception_RequestDate(int amount, string description, DateTime requestDate) 
    { 
     var manager = new AssistanceRequest(amount,description,requestDate); 
     manager.Invoking(x => x.SomeMethodToChangeRequestTime).ShouldThrowExactly<Exception>() 
    } 

    public static IEnumerable<object[]> RequestFakeData 
    { 
     get 
     { 
      // Or this could read from a file. :) 
      return new[] 
      { 
      new object[] { 0,string.Empty,DateTime.Now.AddDays(1) }, 
      new object[] { 2,"",DateTime.Now.AddDays(-2) }, 
      new object[] { -1,string.Empty,DateTime.Now.AddDays(-3) }, 
      }; 
     } 
    } 

ich den Fehler zu dieser Linie erhalten:

var manager = new AssistanceRequest(amount,description,requestDate); 

der Konstruktor versucht, die Eigenschaft zu setzen, damit es die Ausnahme wird. und kommt nicht zur Behauptung.

Meine Frage ist: Wie kann ich das testen, ohne meinen Konstruktor zu ändern?

Antwort

5

ich die Lösung und für diejenigen gefunden, die später überprüfen ich es hier in Ordnung zu bringen.

Wenn wir diese Arten von Ausnahmen in xUnit testen möchten, kann es ein wenig schwierig werden.

Ich las hier einen Artikel: http://hadihariri.com/2008/10/17/testing-exceptions-with-xunit/

es mir meinen Code zu bearbeiten half und die richtige Antwort.

Ich änderte meine Tests wie folgt aus:

[Theory] 
    [MemberData("RequestFakeData")] 
    public void Should_Throw_Exception_RequestDate(int amount, string description, DateTime requestDate) 
    { 
     Exception ex = Assert.Throws<Exception>(() => new AssistanceRequest(amount,description,requestDate)); 
     Assert.Equal("Request Time is not Allowed",ex.Message); 
    } 

    public static IEnumerable<object[]> RequestFakeData 
    { 
     get 
     { 
      return new[] 
      { 
      new object[] { 1,string.Empty,DateTime.Now }, 
      new object[] { 2,"",DateTime.Now.AddDays(-2) }, 
      new object[] { 1,string.Empty,DateTime.Now.AddDays(-3) }, 
      }; 
     } 
    } 

hoffen, dass es hilfreich wäre.

+0

Warum testen Sie den Konstruktor anstelle der Eigenschaft, wie in der Frage gefordert? Sie können eine Instanz mit einem parameterlosen Konstruktor erstellen und die Eigenschaft testen –

2

Ich bin nicht vertraut mit XUnit-Syntax, aber ich würde denken, Sie müssen die "manager.Invoking" -Zeile entfernen, da die Ausnahme in der Zeile oben ausgelöst wird, dann ersetzen Sie es mit einem ExpectedException-Attribut auf dem Test selbst.

Etwas wie:

[ExpectedException(typeof(Exception))] 
[MemberData("RequestFakeData")] 
public void Should_Throw_Exception_RequestDate...... 

Zusätzlich würde ich Schalt Ausnahme für Argument empfehlen.

Edit: Ich kann nicht sicher sein, ob die folgende Syntax korrekt auf der Lambda-Anweisung ist, aber das sollte ein guter Anfang sein.

[MemberData("RequestFakeData")] 
public void Should_Throw_Exception_RequestDate(int amount, string description, DateTime requestDate) 
{ 
    Exception ex = Assert.Throws<Exception>(() => new AssistanceRequest(amount,description,requestDate)); 

    Assert.Equal("Request Time is not Allowed", ex.Message) 
} 

ich hochgerechneten diese Antwort aus: http://hadihariri.com/2008/10/17/testing-exceptions-with-xunit/

+1

Danke für die Antwort, ich bin auf der Suche nach etwas in xUnit, aber ich habe bis jetzt nichts. Es funktioniert nur für VisualStudio-Tests. nicht die xUnit. – MRebati

+0

Entschuldigung, meine eigene Unwissenheit über XUnit zeigt sich dort. Lassen Sie mich wissen, ob das oben genannte etwas ändert. – Lee

+1

Vielen Dank. Weil das mich über meinen Fehler nachdenken ließ und mir half, es auf eine andere Weise zu lösen. – MRebati