할 수 있는 방법에 대해 테스트 예상되는 예외로 특정 예외 메시지 리소스에서 파일을 Visual Studio 테스트?

StackOverflow https://stackoverflow.com/questions/113395

문제

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");
} 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top