저는 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
var exception = Assert.Throws<ArgumentException>(act);
//The thrown exception can be used for even more detailed assertions.
Assert.Equal("expected error message here", exception.Message);
}
모드 세부 단언에 예외를 어떻게 사용할 수 있는지 확인하십시오.
답변
AAA에 대해 엄격하게 알고 싶다면 xUnit의 Record.Exception 을 사용 하여 Act 단계에서 예외를 캡처 할 수 있습니다 .
그런 다음 Assert 단계에서 캡처 된 예외를 기반으로 어설 션을 만들 수 있습니다.
이것의 예는 xUnits 테스트 에서 볼 수 있습니다 .
[Fact]
public void Exception()
{
Action testCode = () => { throw new InvalidOperationException(); };
var ex = Record.Exception(testCode);
Assert.NotNull(ex);
Assert.IsType<InvalidOperationException>(ex);
}
어떤 경로를 따르고 싶은지는 당신에게 달려 있으며, 두 경로 모두 xUnit이 제공하는 것에 의해 완전히 지원됩니다.
답변
AAA를 고수하려면 다음과 같은 것을 고려할 수 있습니다.
// Act
Task act() => handler.Handle(request);
// Assert
await Assert.ThrowsAsync<MyExpectedException>(act);