test - Verificando ArgumentException y su mensaje en Nunit, C#
unit test project c# (3)
En mi programa de prueba en Nunit, quiero verificar que está obteniendo la Excepción de Argumento de escritura al verificar el mensaje.
[Test]
public void ArgumentsWorkbookNameException()
{
const string workbookName = "Tester.xls";
var args = new[] { workbookName, "Sheet1", "Source3.csv", "Sheet2", "Source4.csv" };
Assert.Throws(typeof(ArgumentException), delegate { var appargs = new ApplicationArguments(args); }, "Invalid ending parameter of the workbook. Please use .xlsx");
}
Después de probar esto, esto no funciona cuando modifiqué el mensaje en el programa principal.
int wbLength = args[0].Length;
// Telling the user to type in the correct workbook name file.
if (args[0].Substring(wbLength-5,5)!=".xlsx")
{
throw new ArgumentException(
"Invalid ending parameter of the workbook. Please use .xlsx random random");
}
La prueba de la unidad aún pasó, independientemente de si cambié el mensaje.
¿Cómo lo hago? O no hay tales cosas en C #. Mi colega dijo que hay opciones como esa en Ruby y RSPEC, pero no está 100% seguro en C #.
El parámetro del mensaje en Assert.Throws
no es el mensaje de excepción esperado; es el mensaje de error para incluir con la falla de afirmación si falla la prueba.
No creo que NUnit admita probar el mensaje de excepción de manera inmediata, y yo diría que tales pruebas son innecesariamente frágiles de todos modos. Si realmente quieres escribir tu propio método de ayuda, puedes hacerlo, pero yo personalmente no lo alentaría. (Raramente especifico un mensaje de error de prueba, a menos que sea para incluir alguna información de diagnóstico. Si falla una prueba, voy a ver la prueba de todos modos, por lo que el mensaje no agrega mucho).
Sin embargo, te animo a que uses la sobrecarga genérica y una expresión lambda, por simplicidad:
Assert.Throws<ArgumentException>(() => new ApplicationArguments(args));
(Si ese es su código real, hay otros problemas, intente pasar el new[] { "xyz" }
como argumento ...)
Estoy de acuerdo con Jon en que "tales pruebas son innecesariamente frágiles". Sin embargo, hay al menos dos formas de verificar el mensaje de excepción:
1: Assert.Throws devuelve una excepción, por lo que puede hacer una aserción para su mensaje:
var exception = Assert.Throws<ArgumentException>(() => new ApplicationArguments(args));
Assert.AreEqual("Invalid ending parameter of the workbook. Please use .xlsx random random", exception.Message);
2: también puede usar el atributo ExpectedException . Pero, tome nota de que el atributo espera una excepción en el código probado en su totalidad, no solo en el código que arroja una excepción que usted excepto. Por lo tanto, no se recomienda usar este atributo.
[Test]
[ExpectedException(typeof(ArgumentException), ExpectedMessage = "Invalid ending parameter of the workbook. Please use .xlsx random random")]
public void ArgumentsWorkbookNameException()
{
const string workbookName = "Tester.xls";
var args = new[] { workbookName, "Sheet1", "Source3.csv", "Sheet2", "Source4.csv" };
new ApplicationArguments(args);
}
Use la interfaz fluida para crear aserciones:
Assert.That(() => new ApplicationArguments(args),
Throws.TypeOf<ArgumentException>()
.With.Message.EqualTo("Invalid ending parameter of the workbook. Please use .xlsx random random"));