[c#] 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;
}



답변

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);


답변