私は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;
}
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);
}
あなたが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が提供するものによって完全にサポートされています。