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.