C#:usa StringAssert durante il test di una stringa per le sottostringhe

C#:usa StringAssert durante il test di una stringa per le sottostringhe

Quando stai testando se due stringhe sono uguali, puoi semplicemente usare Assert.AreEqual().

Quando stai verificando se una stringa contiene una sottostringa o un modello, in genere gli sviluppatori usano Assert.IsTrue() con un metodo di sottostringa o regex. Dovresti invece usare StringAssert, perché fornisce messaggi di errore migliori.

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)

Il problema chiave è che Assert.IsTrue() fornisce informazioni inutili. Devi dare un'occhiata allo unit test per capire cosa sta testando e perché ha fallito. StringAssert risolve il problema:fornisce informazioni molto utili.

In questo articolo, mostrerò un esempio completo di confronto tra StringAssert e Assert.IsTrue, quindi mostrerò esempi di come utilizzare ciascuno dei metodi StringAssert.

Esempio:confronto di StringAssert.Contains() con Assert.IsTrue()

Diciamo che hai una classe mapper. Dato un oggetto persona, emette messaggi come questo:

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

Ora vuoi aggiungere un test che verifichi che formatta il nome della persona in base alle regole della cultura. Come lo proveresti?

Ecco come lo faresti usando Assert.IsTrue() con string.Contains():

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

La funzionalità non è ancora implementata, quindi prevedi che il test fallisca (sviluppo test-first). Questo test genera il seguente messaggio di errore:

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

Questo non fornisce informazioni utili su ciò che è stato testato o sul motivo per cui non è riuscito. Per ottenere informazioni più utili, puoi utilizzare StringAssert.Contains(), in questo modo:

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

Quando questo test ha esito negativo, genera il seguente messaggio di errore:

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

Questo messaggio di errore fornisce informazioni sufficienti per comprendere il motivo per cui il test non è riuscito. Non è nemmeno necessario dare un'occhiata allo unit test per capire cosa sta testando e perché ha fallito. Questo è il segno di un buon messaggio di errore.

Confrontalo con il messaggio di errore negativo fornito da Assert.IsTrue(), che richiede di guardare il test per capire cosa sta testando e perché non è riuscito.

Riferimento metodo StringAssert

Questa sezione mostra tutti i metodi di StringAssert e gli esempi di utilizzo.

StringAssert.Contains()

Controlla la stringa per una sottostringa.

Esempio:

var message = "My name is Smith Bob";

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

StringAssert.StartsWith()

Controlla l'inizio della stringa per una sottostringa.

Esempio:

var message = "1234 Hello";

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

StringAssert.EndsWith()

Controlla la fine della stringa per una sottostringa.

Esempio:

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

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

Nota:questo può essere complicato a causa delle terminazioni di riga.

StringAssert.Match()

Verifica se la stringa corrisponde a un modello regex.

Esempio:

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

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

Nota:DoesNotMatch() è l'opposto.

Corrispondenza senza distinzione tra maiuscole e minuscole

Sfortunatamente StringAssert.Contains() non ha un modo per ignorare le maiuscole.

Invece, puoi usare StringAssert.Matches() con RegexOptions.IgnoreCase in questo modo:

var greeting = "Hello world";

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