it-swarm.com.de

Aktivieren Sie eine Ausnahme mit XUnit

Ich bin ein Neuling bei XUnit und Moq. Ich habe eine Methode, die String als Argument nimmt. Wie man eine Ausnahme mit XUnit behandelt.

[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(""));
}

Testmethode

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

Der Ausdruck Assert.Throws fängt die Ausnahme ab und bestätigt den Typ. Sie rufen die zu testende Methode jedoch außerhalb des Assert-Ausdrucks auf und schlagen damit den Testfall fehl.

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

Wenn Sie AAA folgen möchten, können Sie die Aktion in eine eigene Variable extrahieren

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

Wenn Sie in Bezug auf AAA streng sein möchten, können Sie Record.Exception von xUnit verwenden, um die Ausnahme in Ihrer Act-Phase zu erfassen.

Sie können dann Assertions basierend auf der erfassten Ausnahme in der Phase Assert erstellen.

Ein Beispiel hierfür ist in xUnits tests zu sehen.

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

    var ex = Record.Exception(testCode);

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

Es liegt an Ihnen, welchem ​​Pfad Sie folgen möchten, und beide Pfade werden von xUnit vollständig unterstützt.

36
AndyJ