193 votes

Assert une exception en utilisant XUnit

Je suis un débutant à XUnit et Moq. J'ai une méthode qui prend string en argument. Comment gérer une exception en utilisant 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éthode sous test

 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;
}
 

333voto

Nkosi Points 95895

L'expression Assert.Throws capturera l'exception et affirmera le type. Cependant, vous appelez la méthode testée en dehors de l'expression d'assert et vous échouez ainsi dans le cas de test.

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

Si vous voulez suivre AAA, vous pouvez extraire l'action dans sa propre variable

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

58voto

AndyJ Points 580

Si vous ne voulez pas être rigide sur AAA, alors vous pouvez utiliser l'Enregistrement.Exception de xUnit à la capture de l'Exception dans votre Loi sur scène.

Vous pouvez ensuite faire des affirmations basées sur la capture d'exception dans l'Assertion de la scène.

Un exemple de ceci peut être vu dans xUnits tests.

[Fact]
public void Exception()
{
    Action testCode = () => { throw new InvalidOperationException(); };

    var ex = Record.Exception(testCode);

    Assert.NotNull(ex);
    Assert.IsType<InvalidOperationException>(ex);
}

C'est à vous de quel chemin vous voulez suivre, et les deux chemins sont entièrement pris en charge par ce xUnit fournit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X