C#:use StringAssert cuando pruebe una cadena para subcadenas

C#:use StringAssert cuando pruebe una cadena para subcadenas

Cuando está probando si dos cadenas son iguales, simplemente puede usar Assert.AreEqual().

Cuando está probando si una cadena contiene una subcadena o un patrón, normalmente los desarrolladores usan Assert.IsTrue() con un método de subcadena o expresión regular. Debería usar StringAssert en su lugar, porque da mejores mensajes de error.

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)

El problema clave es Assert.IsTrue() proporciona información inútil. Tienes que mirar la prueba unitaria para entender qué está probando y por qué falló. StringAssert resuelve el problema:brinda información muy útil.

En este artículo, mostraré un ejemplo completo comparando StringAssert vs Assert.IsTrue, y luego mostraré ejemplos de cómo usar cada uno de los métodos de StringAssert.

Ejemplo:comparación de StringAssert.Contains() con Assert.IsTrue()

Digamos que tienes una clase de mapeador. Dado un objeto de persona, genera mensajes como este:

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

Ahora desea agregar una prueba que verifique que formatea el nombre de la persona de acuerdo con las reglas culturales. ¿Cómo probarías esto?

Así es como lo haría 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 funcionalidad aún no está implementada, por lo que espera que la prueba falle (desarrollo de prueba primero). Esta prueba produce el siguiente mensaje de error:

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

Esto no brinda ninguna información útil sobre lo que se estaba probando o por qué falló. Para obtener más información útil, puede usar StringAssert.Contains(), así:

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

Cuando esta prueba falla, produce el siguiente mensaje de error:

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

Este mensaje de falla le brinda suficiente información para comprender por qué falló la prueba. Ni siquiera necesita mirar la prueba unitaria para comprender qué está probando y por qué falló. Esta es la marca de un buen mensaje de falla.

Compare esto con el mensaje de error incorrecto proporcionado por Assert.IsTrue(), que requiere que mire la prueba para comprender qué está probando y por qué falló.

Referencia del método StringAssert

Esta sección muestra todos los métodos StringAssert y ejemplos de su uso.

StringAssert.Contains()

Comprueba la cadena en busca de una subcadena.

Ejemplo:

var message = "My name is Smith Bob";

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

Afirmación de cadena.Empieza con()

Comprueba el inicio de la cadena en busca de una subcadena.

Ejemplo:

var message = "1234 Hello";

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

StringAssert.EndsWith()

Comprueba el final de la cadena en busca de una subcadena.

Ejemplo:

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:Este puede ser complicado debido a los finales de línea.

Afirmación de cadena.Coincidencias()

Comprueba si la cadena coincide con un patrón de expresión regular.

Ejemplo:

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

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

Nota:DoesNotMatch() es lo contrario.

Coincidencia insensible a mayúsculas y minúsculas

Desafortunadamente, StringAssert.Contains() no tiene una forma de ignorar mayúsculas y minúsculas.

En su lugar, puede usar StringAssert.Matches() con RegexOptions.IgnoreCase así:

var greeting = "Hello world";

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