unit test net español ejemplo c# unit-testing xunit

c# - test - Afirmar una excepción usando XUnit



xunit vs mstest (2)

Soy un novato en XUnit y Moq. Tengo un método que toma una cadena como argumento. Cómo manejar una excepción usando XUnit.

[Fact] public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() { //arrange ProfileRepository profiles = new ProfileRepository(); //act var result = profiles.GetSettingsForUserID(""); //assert //The below statement is not working as expected. Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID("")); }

Método bajo prueba

public IEnumerable<Setting> GetSettingsForUserID(string userid) { if (string.IsNullOrWhiteSpace(userid)) throw new ArgumentException("User Id Cannot be null"); var s = profiles.Where(e => e.UserID == userid).SelectMany(e => e.Settings); return s; }


La expresión Assert.Throws detectará la excepción y afirmará el tipo. Sin embargo, está llamando al método bajo prueba fuera de la expresión de aserción y, por lo tanto, falla el caso de prueba.

[Fact] public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() { //arrange ProfileRepository profiles = new ProfileRepository(); // act & assert Assert.Throws<ArgumentException>(() => profiles.GetSettingsForUserID("")); }

Si está decidido a seguir AAA, puede extraer la acción en su propia variable

[Fact] public void ProfileRepository_GetSettingsForUserIDWithInvalidArguments_ThrowsArgumentException() { //arrange ProfileRepository profiles = new ProfileRepository(); //act Action act = () => profiles.GetSettingsForUserID(""); //assert Assert.Throws<ArgumentException>(act); }


Si desea ser rígido con respecto a AAA, puede usar Record.Exception de xUnit para capturar la excepción en su etapa Act.

Luego puede hacer aserciones basadas en la excepción capturada en la etapa Afirmar.

Un ejemplo de esto se puede ver en las pruebas de xUnits .

[Fact] public void Exception() { Action testCode = () => { throw new InvalidOperationException(); }; var ex = Record.Exception(testCode); Assert.NotNull(ex); Assert.IsType<InvalidOperationException>(ex); }

Depende de usted qué ruta desea seguir, y ambas rutas son totalmente compatibles con lo que proporciona xUnit.