2016-03-22 21 views
3

EDIT: Es gibt eine ähnliche Frage here, aber die Lösungen schlagen nur Problemumgehungen vor und bieten keine Einblicke in die Ursache des Problems oder wie es zu beheben. Diese Frage kann immer noch ein Duplikat sein.C# Xunit, Assert.Throws schlägt fehl, wenn erwartete Ausnahme ausgelöst wird

EDIT 2: Es stellt sich heraus, dieses Problem nur während Debug geschieht, obwohl es nicht früher geschah. Nach dem Ersetzen von (TCheck)null durch null as TCheck werden die Tests bestanden, wenn sie ausgeführt werden, aber beim Debuggen wird eine Ausnahme ausgelöst.

ORIGINAL POST: Ich habe eine Methode in einem Unit-Test, der wie diese

internal void EqualityAssert<TCheck, TEquatable>(TEquatable item, ...) 
    where TCheck : class, IEquatable<TEquatable>, TEquatable 
{ 

    // Various equality assertions that are passing 
    // ... 

    // A == null  
    Assert.Throws<NullReferenceException>(
    () => ((IEquatable<TEquatable>)item).Equals((TCheck)null));    
} 

Diese Methode wird von verschiedenen Unit-Tests aufgerufen wird, und jeder dieser Tests versagen, weil eine „Unbehandelte Nullreferenceexception sieht wurde genau dort angetroffen, wo es erwartet wird.

Assert.Throws funktionierte für mich früher richtig, aber ich konnte nicht herausfinden, was geändert wurde, um es zu brechen.

+0

wegen der Könnte '(Tcheck) null'. Versuchen Sie, dies auf "null as TCheck" zu ändern. Ich habe es einfach ausprobiert und es sieht nicht sehr wahrscheinlich aus, aber es wäre schön zu sehen, was in Ihrem Szenario passiert. –

+0

Haben Sie versucht, Ihren Test zu debuggen? – rclocher3

+0

@StephenRoss Das Problem wurde nicht gelöst, ich bekomme immer noch die Ausnahme in der Equals-Implementierung, genau dort, wo sie erwartet wurde. –

Antwort

0

Sie werfen Ausnahme, aber Sie sollten damit umgehen.Klicken Sie unten Code. Sie können Ihren Code gemäß meinem Beispiel ändern.

var message = FakeRequestBuilder.CreateSettlementFileMessage(); 

var warning = Assert.Throws<ExF.Core.Exception.IntegrationValidationException>(
       () => createSettlementFileHandler.Handle(message)); 

Assert.Equal(warning.ErrorCode, -1); 
4

besser, dieses Muster zu verwenden:

[Fact] 
public void Divide_TwoNumbers_ExpectException() 
{ 
    var sut = new Calculator(); 
    var exception = Record.Exception(() => sut.Divide(10, 0)); 
    Assert.IsType(typeof(DivideByZeroException), exception); 
} 
+2

Warum ist es besser? (Nicht zu sagen, dass es nicht ist, aber es würde diese Antwort verbessern) – ediblecode

+1

Für asynchrone Methode verwende: 'Record.Exception (() => GetSomeAsync(). GetAwaiter(). GetResult());', –

+2

Diese Antwort ist Kopieren & Einfügen von https://www.richard-banks.org/2015/07/stop-using-assertthrows-in-your-bdd.html. Sie sollten es als Quelle verknüpfen. –

Verwandte Themen