C# – Verwenden Sie StringAssert, wenn Sie eine Zeichenfolge auf Teilzeichenfolgen testen

C# – Verwenden Sie StringAssert, wenn Sie eine Zeichenfolge auf Teilzeichenfolgen testen

Wenn Sie testen, ob zwei Zeichenfolgen gleich sind, können Sie einfach Assert.AreEqual() verwenden.

Wenn Sie testen, ob ein String einen Teilstring oder ein Muster enthält, verwenden Entwickler normalerweise Assert.IsTrue() mit einer Teilstringmethode oder Regex. Sie sollten stattdessen StringAssert verwenden, da es bessere Fehlermeldungen liefert.

var greeting = "Hi Socrates, why are you here?";

//use this
StringAssert.Contains(greeting, "Hello");
/*
 * Failure message:
 * StringAssert.Contains failed. String 'Hi Socrates, why are you here?' does not contain string 'Hello'. .
*/

//instead of this
Assert.IsTrue(greeting.Contains("Hello"));
/*
 * Failure message:
 * Assert.IsTrue failed. 
 */ Code language: JavaScript (javascript)

Das Hauptproblem ist, dass Assert.IsTrue() nutzlose Informationen liefert. Sie müssen sich den Komponententest ansehen, um zu verstehen, was er testet und warum er fehlgeschlagen ist. StringAssert löst das Problem – es gibt sehr hilfreiche Informationen.

In diesem Artikel zeige ich ein vollständiges Beispiel, in dem StringAssert mit Assert.IsTrue verglichen wird, und zeige dann Beispiele für die Verwendung der einzelnen StringAssert-Methoden.

Beispiel – Vergleich von StringAssert.Contains() mit Assert.IsTrue()

Angenommen, Sie haben eine Mapper-Klasse. Bei einem Personenobjekt gibt es Nachrichten wie diese aus:

1234
2560a3e3cea7479ab28a4b56b0a4fc9f
<<full name based on culture rules>>
2021-01-04T08:15:42.0467508-05:00Code language: plaintext (plaintext)

Jetzt möchten Sie einen Test hinzufügen, der überprüft, ob der Name der Person gemäß den Kulturregeln formatiert wird. Wie würden Sie das testen?

So würden Sie es mit Assert.IsTrue() mit string.Contains() machen:

[TestMethod()]
public void TestMapper_WhenNameIsBobSmith_AndRuleIsFamilyThenGiven_ThenMessageContainsSmithBob()
{
	//arrange
	var person = new Person()
	{
		FamilyName = "Smith",
		GivenName = "Bob",
		FullNameCultureRule = FullNameCultureRules.FamilyThenGiven
	};

	var mapper = new PersonMessageMapper();

	//act
	var message = mapper.MapToMessage(person);

	//assert
	Assert.IsTrue(message.Contains("Smith Bob"));
}
Code language: C# (cs)

Die Funktionalität ist noch nicht implementiert, daher erwarten Sie, dass der Test fehlschlägt (Test-First-Entwicklung). Dieser Test erzeugt die folgende Fehlermeldung:

Assert.IsTrue failed. Code language: plaintext (plaintext)

Dies gibt keine nützlichen Informationen darüber, was getestet wurde oder warum es fehlgeschlagen ist. Um weitere nützliche Informationen zu erhalten, können Sie StringAssert.Contains() wie folgt verwenden:

[TestMethod()]
public void TestMapper_WhenNameIsBobSmith_AndRuleIsFamilyThenGiven_ThenMessageContainsSmithBob()
{
	//arrange
	var person = new Person()
	{
		FamilyName = "Smith",
		GivenName = "Bob",
		FullNameCultureRule = FullNameCultureRules.FamilyThenGiven
	};

	var mapper = new PersonMessageMapper();

	//act
	var message = mapper.MapToMessage(person);

	//assert
	StringAssert.Contains(message, "Smith Bob");
}
Code language: C# (cs)

Wenn dieser Test fehlschlägt, wird die folgende Fehlermeldung ausgegeben:

StringAssert.Contains failed. String '1234
7b4563cffaf243b9b00337b994e23c5d
2021-01-04T08:23:52.8571802-05:00
' does not contain string 'Smith Bob'. .Code language: plaintext (plaintext)

Diese Fehlermeldung gibt Ihnen genügend Informationen, um zu verstehen, warum der Test fehlgeschlagen ist. Sie müssen sich den Komponententest nicht einmal ansehen, um zu verstehen, was getestet wird und warum er fehlgeschlagen ist. Dies ist das Kennzeichen einer guten Fehlermeldung.

Vergleichen Sie dies mit der schlechten Fehlermeldung von Assert.IsTrue() – die erfordert, dass Sie sich den Test ansehen, um zu verstehen, was er testet und warum er fehlgeschlagen ist.

StringAssert-Methodenreferenz

Dieser Abschnitt zeigt alle StringAssert-Methoden und Anwendungsbeispiele.

StringAssert.Contains()

Überprüft den String auf einen Teilstring.

Beispiel:

var message = "My name is Smith Bob";

StringAssert.Contains(message, "Smith Bob");
Code language: C# (cs)

StringAssert.StartsWith()

Überprüft den Anfang des Strings auf einen Teilstring.

Beispiel:

var message = "1234 Hello";

StringAssert.StartsWith(message, "1234");
Code language: C# (cs)

StringAssert.EndsWith()

Überprüft das Ende des Strings auf einen Teilstring.

Beispiel:

var sb = new StringBuilder();
sb.AppendLine("1234");
sb.AppendLine("00");
var message = sb.ToString();

StringAssert.EndsWith(message, $"00{Environment.NewLine}");
Code language: C# (cs)

Hinweis:Dieser kann aufgrund von Zeilenenden schwierig sein.

StringAssert.Matches()

Überprüft, ob der String mit einem Regex-Muster übereinstimmt.

Beispiel:

var message = Guid.NewGuid().ToString("N");

StringAssert.Matches(message, new Regex("[a-z0-9]{32}"));
Code language: C# (cs)

Hinweis:DoesNotMatch() ist das Gegenteil.

Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung

Leider hat StringAssert.Contains() keine Möglichkeit, die Groß-/Kleinschreibung zu ignorieren.

Stattdessen können Sie StringAssert.Matches() mit RegexOptions.IgnoreCase wie folgt verwenden:

var greeting = "Hello world";

StringAssert.Matches(greeting, new Regex("hello", RegexOptions.IgnoreCase));
Code language: C# (cs)