XUnit erweitern Assert Klasse mit neuen Asserts

7

Ich versuche, die xUnit-Assert-Methode zu erweitern, indem ich Selen-Funktionalität hinzufüge

%Vor%

Aber ich bekomme diesen Kompilierfehler, wenn ich versuche, ihn zu benutzen.

%Vor%

Und der Fehler

%Vor%

Weiß jemand, ob das möglich ist oder wo ich falsch liege?

    
Neil 24.04.2013, 14:42
quelle

5 Antworten

3

Sie benötigen eine Objekteingabe, die als dieses Argument an die Erweiterungsmethode übergeben wird. In Ihrem Fall wäre das die korrekte Syntax

%Vor%

Aber ich nehme an, Sie brauchen keine Instanz der Assert-Klasse oder können sie gar nicht erstellen.

Was Sie versuchen, ist Aufruf der Erweiterungsmethode als statischer Aufruf für die erweiterte Klasse und das wird nicht funktionieren. Aber warum nicht einfach

anrufen %Vor%     
jure 24.04.2013, 20:10
quelle
10

Edit 2 xUnit 2 hat letztendlich die Assertions vollständig in eine separate Assembly verschoben. Es gibt sowohl kompilierte als auch reine Quellpakete auf NuGet, und die Assert -Klasse ist partiell. Daher wird Assert sehr einfach erweiterbar (in C #, also), indem die Quellversion des Pakets verwendet wird.

Bearbeiten Für mehr Vollständigkeit: xUnit 2 entfernt diesen Erweiterungspunkt und empfiehlt die Verwendung von Erweiterungsmethoden im Sinne von 'fließenden' Assertion-Bibliotheken.

Zur Vollständigkeit: Hier ist eine Beschreibung des "offiziellen" Weges zur Erweiterung von Assert (der überraschenderweise überhaupt nicht erwähnt wurde, obwohl Brad Wilson sogar an der Diskussion teilnahm).

Ab Version 1.5 (gemäß dem Blog von Brad) unterstützt xUnit.Extensions dies explizit über die Klassen Assertions und TestClass . Es funktioniert so:

TestClass hat eine Eigenschaft namens Assert vom Typ Assertions , die alle Methoden auf Xunit.Assert weiterleitet. Da TestClass.Assert eine Instanz ist, können Sie Methoden über Erweiterungsmethoden für Assertions hinzufügen:

%Vor%

Jetzt müssen Sie Ihre Testklasse von Xunit.Extensions.TestClass ableiten lassen (zum Verwechseln gibt es auch Xunit.TestClass , was nicht das ist, was Sie wollen), und die Assert -Eigenschaft wird den Xunit.Assert -Typ "shadow" wenn Sie qualifizieren den Namen nicht explizit.

In Ihrer Testklasse, die von TestClass abgeleitet ist, können Sie jetzt

verwenden %Vor%

Der einzige wirkliche Unterschied zu einer eingebauten xUnit-Assertion ist (abgesehen von der Tatsache, dass die Syntaxfärbung für Assert die eines Bezeichners und nicht eines Typs ist), dass bei einem Fehler einfach ein TrueException erhalten wird. nicht ein bestimmtes DeepEqualsException , das Ihnen hypothetisch sagen könnte, wo der Vergleich fehlgeschlagen ist. Aber natürlich könnte man das auch auf die gleiche Weise bauen.

    
TeaDrivenDev 04.05.2014 02:25
quelle
3

Sorry, aber du wirst verwirrt (EDIT: und ich auch!). Der Assert von xUnit.net ist static und kann daher keine Erweiterungen hinzufügen (obwohl andere Assertion-Bibliotheken diesen Ansatz nicht verwenden, weshalb man erwarten könnte, Erweiterungsmethoden zu verwenden, um Assert zu erweitern). Wenn Sie also im xUnit.net-Universum eine benutzerdefinierte Assertion hinzufügen möchten, fügen Sie eine neue statische Klasse mit einem anderen Namen hinzu.

Sie können Ihren Ansatz nutzen, indem Sie Ihre Klasse ändern von:

%Vor%

zu:

%Vor%

und dann @ BradWilson Trick des Hinzufügens:

%Vor%

am Anfang jeder Datei, die Ihre Erweiterungen benötigt.

Diese Technik ist praktisch für das Hinzufügen von Überladungen, um darüber nachzudenken ....

(Die offensichtliche Schwäche ist, dass Sie nicht mehr als einen direkt über Assert. haben können)

    
Ruben Bartelink 24.04.2013 23:56
quelle
3

Zusammenfassung der Lösung für xUnit 2 . (Arbeitete für mich für Version 2.1.0 von NuGet.)

Assert ist eine partielle Klasse, die Sie erweitern können, indem Sie ein anderes Teil hinzufügen. Dazu müssen Sie die Assert-Assembly aus Quellen kompilieren. Sie können xunit.assert.source NuGet verwenden, um die Quellen abzurufen.

Die Schritte

  1. Entfernen Sie den Verweis auf das xunit.assert NuGet-Paket aus dem Projekt.
  2. Stattdessen installieren Sie das Paket xunit.assert.source .
  3. Definieren Sie im Namensraum Xunit public partial class Assert und fügen Sie dort Ihre benutzerdefinierten Behauptungen hinzu.

Beispiel für eine benutzerdefinierte Bestätigung:

%Vor%

Hinweis: Andere Antworten und Bearbeitungen weisen ebenfalls auf die Lösung hin, aber ich brauchte einiges, um es von dort herauszufinden. Ich behaupte auch nicht, dass dies die einzige oder die beste Option ist.

    
Premil 18.03.2016 15:32
quelle
0

Für xUnit 2 + :

1) Fügen Sie dem Projekt mit Erweiterungen xunit.assert.source Nuget-Paket hinzu.

2) Erstellen Sie eine partielle Klassendefinition:

%Vor%     
alexey 02.02.2018 15:31
quelle