web-dev-qa-db-ja.com

XUnitを使って例外をアサートする

私はXUnitとMoqの初心者です。引数として文字列を取るメソッドがあります。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(""));
}

試験中の方法

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

Assert.Throws 式は例外をキャッチして型をアサートします。ただし、assert式の外側でテスト対象のメソッドを呼び出しているため、テストケースが失敗します。

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

AAAに従うことに集中しているなら、あなたはそれ自身の変数にアクションを抽出することができます

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

あなたがAAAについて厳格になりたいのであれば、あなたはあなたのActステージでExceptionを捕捉するためにxUnitから Record.Exception を使うことができます。

その後、Assertステージでキャプチャした例外に基づいてアサーションを作成できます。

この例は xUnitsテスト で見ることができます。

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

    var ex = Record.Exception(testCode);

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

どのパスをたどるかはあなた次第です。どちらのパスもxUnitが提供するものによって完全にサポートされています。

29
AndyJ