Ich bin ein Neuling bei XUnit und Moq. Ich habe eine Methode, die Zeichenfolge als Argument verwendet. 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;
}
c#
unit-testing
xunit
Wandermonk
quelle
quelle
GetSettingsForUserID("")
bevor Sie anrufenAssert.Throws
. DerAssert.Throws
Anruf kann Ihnen dort nicht helfen. Ich würde vorschlagen, weniger starr über AAA zu sein ...Antworten:
Der Assert.Throws- Ausdruck fängt die Ausnahme ab und bestätigt den Typ. Sie rufen jedoch die zu testende Methode außerhalb des Assert-Ausdrucks auf und schlagen damit den Testfall nicht.
Wenn Sie AAA folgen möchten, können Sie die Aktion in eine eigene Variable extrahieren.
Beachten Sie, wie die Ausnahme auch für detaillierte Zusicherungen im Modus verwendet werden kann
quelle
async Task act() => await service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);
Task act() => service.DoTheThingAsync(); await Assert.ThrowsAsync<InvalidOperationException>(act);
damit zufrieden ist und gut funktioniert.Wenn Sie in Bezug auf AAA starr 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 Assert-Phase erstellen.
Ein Beispiel hierfür sind xUnits-Tests .
Es liegt an Ihnen, welchem Pfad Sie folgen möchten, und beide Pfade werden von xUnit vollständig unterstützt.
quelle
var exception = Assert.Throws<InvalidOperationException>(testCode);
und Behauptung unterscheidenexception.Message
? oder ist es nur eine andere Art, dasselbe zu erreichen?Sie könnten so etwas in Betracht ziehen, wenn Sie sich an AAA halten möchten:
quelle