web-dev-qa-db-fra.com

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

L'expression Assert.Throws interceptera 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);
}
117
Nkosi

Si vous voulez être rigide à propos de AAA, vous pouvez utiliser Record.Exception de xUnit pour capturer l'exception à l'étape Act.

Vous pouvez ensuite faire des assertions en fonction de l'exception capturée à l'étape Assert.

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

[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 choisir le chemin que vous voulez suivre, et les deux chemins sont entièrement pris en charge par ce que xUnit fournit.

36
AndyJ