할 수 있는 방법에 대해 테스트 예상되는 예외로 특정 예외 메시지 리소스에서 파일을 Visual Studio 테스트?
-
02-07-2019 - |
문제
Visual Studio 테스트를 확인할 수 있습에 대한 예외를 사용하 ExpectedException 특성.전달할 수 있는 예외에 다음과 같다:
[TestMethod]
[ExpectedException(typeof(CriticalException))]
public void GetOrganisation_MultipleOrganisations_ThrowsException()
도 확인할 수 있습에 대한 메시지에 포함된 ExpectedException 다음과 같다:
[TestMethod]
[ExpectedException(typeof(CriticalException), "An error occured")]
public void GetOrganisation_MultipleOrganisations_ThrowsException()
그러나 때 테스트 I18N 응용 프로그램을 사용하는 리소스 파일을 얻을 수 있는 오류 메시지(어떤 수 있도 결정을 테스트하는 다른 버전의 경우에는 오류 메시지고 싶지만,Visual Studio 지 않게 해주세요:
[TestMethod]
[ExpectedException(typeof(CriticalException), MyRes.MultipleOrganisationsNotAllowed)]
public void GetOrganisation_MultipleOrganisations_ThrowsException()
컴파일러는 다음과 같은 오류가:
특성이 인수야 일정 식,식 typeof 또는 배열 창조의 표현 특성
누군가하는 방법을 알고 테스트를 위한 예외 메시지가 있는 리소스 파일에서?
옵션 중 하나가 고려를 사용하여 사용자 지정외 클래스,그에 따라 자주 듣고 조언과 같은:
"너를 만들고 던져 사용자 정의 예외 이 있는 경우는 오류 조건 될 수 있는 프로그래밍 방식으로 처리에 다른 방법으로 기존의 다른 예외는 아니다.그렇지 않으면 던져나 기존 예외가 있습니다." 원
난 기대하지 않을 처리하는 예외에서 다르게 정상적인 흐름(그것의 중요한 예외는,그래서 난황 모드 어쨌든)그리고 나는 생각하지 않을 만들에 대한 예외 각각의 테스트 사례는 것은 당연한 일입니다.어떤 의견?
해결책
그 는 의견만 말하는 것 오류를 텍스트:
- 은 부품의 테스트,어떤 경우에서 점점 자원을 것'wrong'(수 있었다 그렇지 않으면 끝날 일관되게 망 리소스),그래서 그냥 업데이트하 테스트를 변경하면 리소스(또는 테스트 실패)
- 지 않은 부분의 테스트,그리고 당신이해야만 관리는 그것을 던졌 예외는 아니다.
첫 번째 옵션을 테스트 할 수 있도록 여러 언어를 부여하는 기능으로 실행됩니다.
로에 대한 예외를 여러 개,나는 C++에서 땅을 만들의 예외(의 포인트 중 하나당'throw'성공적으로 완료되었습니다!) 에서 큰 heirachies 은 수락가능(지 않은 경우 일반적이다),하지만.Net 의 메타데이터 체계 아마를 좋아하지 않는다,따라서는 조언.
다른 팁
내가 사용하는 것이 좋습니다 것이 도우미 방법 대신 특성이 있습니다.무언가 이것을 좋아한다:
public static class ExceptionAssert
{
public static T Throws<T>(Action action) where T : Exception
{
try
{
action();
}
catch (T ex)
{
return ex;
}
Assert.Fail("Exception of type {0} should be thrown.", typeof(T));
// The compiler doesn't know that Assert.Fail
// will always throw an exception
return null;
}
}
다음를 작성할 수 있습 테스트 뭔가 다음과 같다:
[TestMethod]
public void GetOrganisation_MultipleOrganisations_ThrowsException()
{
OrganizationList organizations = new Organizations();
organizations.Add(new Organization());
organizations.Add(new Organization());
var ex = ExceptionAssert.Throws<CriticalException>(
() => organizations.GetOrganization());
Assert.AreEqual(MyRes.MultipleOrganisationsNotAllowed, ex.Message);
}
또한 이것을 활용할 수 있는 이점이 있는지 확인하는 예외가 발생 라인에 당신을 기대했던 그것을 던져 대신에 어느 곳에서 당신의 테스트 방법입니다.
이 ExpectedException 메시지는 인수와 일치하지 않에 대한 메시지의 예외는 아니다.오히려 이것은 메시지는 인쇄에서 테스트 결과는 경우 예상되는 예외하지 않았다는 사실에 발생합니다.
나는 생각할 수 있습니다 그냥 하는 명시적 try-catch 테스트 코드에서는 대신에 의존하 ExpectedException 특성하는 당신을 위해 그것을 할 수 있습니다.할 수 있습니다 다음 몇 가지 방법을 도우미는 리소스 파일을 읽을 비교하에게 오류 메시지 중 하나와 함께 제공되는 예외를 잡았다.(물론 경우는 없었다는 예외는 다음 테스트 사례를 것으로 간주되어야 실패)
는 경우에 당신은 스위치를 사용하여 매우 좋 xUnit.Net 테스트 라이브러리 교체할 수 있습니다[ExpectedException]과 함께 무언가 이것을 좋아한다:
[Fact]
public void TestException()
{
Exception ex = Record.Exception(() => myClass.DoSomethingExceptional());
// Assert whatever you like about the exception here.
}
I wonder if NUnit 은 아래로 이동 경로에서 단순...그러나 여기 있습니다.
새로운 개선 사항(2.4.3 까지?) 을 ExpectedException 특성할 수 있는 더 제어에 검사를 수행할에서 예상되는 예외를 통해 처리 방법.에 대한 자세한 정보 공식 NUnit doc 페이지..의 끝으로 페이지입니다.
[ExpectedException( Handler="HandlerMethod" )]
public void TestMethod()
{
...
}
public void HandlerMethod( System.Exception ex )
{
...
}
참고:뭔가 느낌이 되지 않습니다.왜 당신의 예외 메시지를 다국어..당신은 당신을 사용하여 예외가 필요로 하는 것을 처리 또는 사용자에게 통보.가 없는 한 무리의 문화적으로 다양한 개발자 버그를 수정하고..당신이 하지 말아야 될 필요하다.예외에서 영어 또는 일반적인 허용된 언어에 충분합니다.하지만 경우에 당신은이..가능:)
이 질문하는 동안 유사한 문제를 해결하에 나 자신입니다.(나는 세부 솔루션에 정착했다.)
동의합 Gishu s 의견에 대한 국제화의 예외 메시지 코드 냄새가 있다.
나이에서 처음 나의 자신의 프로젝트를 가질 수 있도록 사이의 일관성 오류 메시지를 던져 내 응용 프로그램에서 제 단위 테스트를 확인할 수 있습니다ie,만 있을 정의하는 나의 예외 메시지를 한 장소와 시간에,리소스 파일 듯 합리적인 곳이었을 때부터 이미 사용하고 그것을 위해 다양한 레이블 문자열은(이후 그것은 참조를 추가하려면에서 테스트 코드는지 확인하는 사람들 같은 라벨을 보여 적절한 곳에).
한 지점에서 나도 고려했다(테스트)을 이용하여 시도/catch 블록 요구 사항을 피하려면의 일정에 의해 ExpectedException 특성,하지만 이처럼 보였다 좋은 결과를 얻을 수 있습니다.하의 꽤 많은 여분의 코드를 적용하는 경우에는 큰 규모입니다.
끝에서,솔루션에 정착했을 만드는 정적이 클래스 내에서 리소스 라이브러리고 저장은 예외 메시지는 것입니다.이 방법은 필요가 없 국제화하기 위해(그는 것에 동의하지 않은 의미)와 그들이 만들어 언제든지 액세스할 수 있는 리소스 문자열에 액세스할 수 있기 때문에 그들이 동일한 네임스페이스가 있습니다.(이에 맞는 나의 욕망하지 않을 확인하는 예외를 텍스트 복잡한 프로세스입니다.)
테스트 코드는 다음 단순히 귀결(용서 엉망으로...):
[Test,
ExpectedException(typeof(System.ArgumentException),
ExpectedException=ProductExceptionMessages.DuplicateProductName)]
public void TestCreateDuplicateProduct()
{
_repository.CreateProduct("TestCreateDuplicateProduct");
_repository.CreateProduct("TestCreateDuplicateProduct");
}