unit tutorial test practices net dotnet best c# unit-testing nunit decimal

c# - tutorial - ¿Cómo probar con decimal.MaxValue?



unit testing c# best practices (3)

Ahora que todos los demás han dicho, por qué ocurre este problema, su código debe usar el atributo TestCaseSource para escribir su prueba:

private static object[] TestValues = { new object[]{ Decimal.MaxValue }, new object[]{ Decimal.MinValue } }; [TestCaseSource("TestValues")] public void FooTest(decimal value) { Assert.That(value, Is.EqualTo(Decimal.MaxValue)); }

Considere la siguiente prueba:

public void FooTest(decimal? val) { Check.That(true).IsTrue(); }

Quiero ejecutar esta prueba con valores extremos (es decir, MaxValue y MinValue ).

[TestCase(decimal.MaxValue)]

Esto genera el siguiente error: un argumento de atributo debe ser una expresión constante, tipo de expresión o expresión de creación de matriz de un tipo de parámetro de atributo

[TestCase(79228162514264337593543935)]

Obtengo este ahora: la constante integral es demasiado grande

Un último intento desesperado:

[TestCase(79228162514264337593543935M)]

Obviamente, obtengo este debido a la conversión: un argumento de atributo debe ser una expresión constante, tipo de expresión o expresión de creación de matriz de un tipo de parámetro de atributo

¿Cómo se escribe una prueba unitaria con decimal.MaxValue como parámetro? Podría escribir una prueba específica para este caso problemático, pero me gustaría saber si hay una manera de escribir un TestCase como este.


No importa si intenta usar [TestCase(Decimal.MaxValue)] o usar un literal como [TestCase(1m)] . Tampoco funcionará.

De acuerdo con la especificación de C # (17.1.3, tipos de parámetros de atributo):

Los tipos de parámetros posicionales y con nombre para una clase de atributo están limitados a los tipos de parámetros de atributo, que son:
• Uno de los siguientes tipos: bool, byte, char, double, float, int, long, sbyte, short, string, uint, ulong, ushort.
• El objeto tipo.
• El tipo System.Type.
• Un tipo de enumeración, siempre que tenga acceso público y los tipos en los que está anidado (si corresponde) también tienen acceso público (§17.2).
• Matrices unidimensionales de los tipos anteriores.

Observe la ausencia de decimales en el primer elemento de la lista.

El mensaje de error es un poco engañoso porque la misma especificación también dice que un decimal puede ser una expresión constante (7.19).

Pero si observa el código de IL al crear un decimal , verá que realmente invoca una llamada de constructor: newobj System.Decimal..ctor . Y eso es diferente a otros literales, por ejemplo, ldc.r8 33 33 33 33 33 33 F3 3F para var a = 1.2; .