2013-10-14 4 views
1

내 추상 클래스 생성자가 잘못된 인수를 올바르게 처리하는지 테스트 검사를 작성하고 싶습니다. NSubstitute 대신 ArgumentExceptionTargetInvocationException을 발생하기 때문에,NSubstitute의 TargetInvocationException

[TestMethod] 
[ExpectedException(typeof(ArgumentException))] 
public void MyClassCtorTest() 
{ 
    var dummy = Substitute.For<MyClass>("invalid-parameter"); 
} 

이 테스트를 통과하지 : 나는 테스트를 썼다. 실제 예외는 인 InnerException입니다. 나는 도우미 메서드를 쓸 수있다 :

internal static class Util { 

    public static void UnpackException(Action a) { 

     try { 

      a(); 
     } catch (TargetInvocationException e) { 

      throw e.InnerException; 
     } catch (Exception) { 

      throw new InvalidOperationException("Invalid exception was thrown!"); 
     } 
    } 
} 

그러나 나는 그 문제를 해결하기위한 일반적인 방법이 있어야한다고 생각한다. 하나 있습니까?

답변

2

NS 대체품은 현재이 문제를 해결하는 일반적인 방법이 없습니다.

다른 해결 방법에는 추상 클래스를 수동으로 서브 클래스하여 생성자를 테스트하거나 ExpectedException을 사용하는 대신 내부 예외를 수동으로 지정하는 것입니다.

[TestFixture] 
public class SampleFixture { 
    private class TestMyClass : MyClass { 
     public TestMyClass(int i) : base(i) { } 
     // ... stub/no-op implementations of any abstract members ... 
    } 

    [Test] 
    [ExpectedException(typeof(ArgumentOutOfRangeException))] 
    public void TestInvalidConstructorArgUsingSubclass() 
    { 
     new TestMyClass(-5); 
    } 
    // Aside: I think `Assert.Throws` is preferred over `ExpectedException` now. 
    // See http://stackoverflow.com/a/15043731/906 
} 
: 우리는 기본 클래스 생성자를 테스트하기 위해 테스트 픽스처의 서브 클래스를 생성 할 수 있습니다

public abstract class MyClass { 
    protected MyClass(int i) { 
     if (i < 0) { 
      throw new ArgumentOutOfRangeException("i", "Must be >= 0"); 
     } 
    } 
    // ... other members ... 
} 

: 예를 들어

, 우리는 양의 정수를 필요로하는 추상 클래스가 있다고 가정 해

또는 조롱 프레임 워크를 사용하고 내부 예외에 대해 주장 할 수 있습니다.

[Test] 
    public void TestInvalidConstructorArg() 
    { 
     var ex = Assert.Throws<TargetInvocationException>(() => Substitute.For<MyClass>(-5)); 

     Assert.That(ex.InnerException, Is.TypeOf(typeof(ArgumentOutOfRangeException))); 
    } 
+0

... "당신을 수동으로 내부 예외에 주장하는 방법 : 나는 우리가 TargetInvocationException에 파고하는 이유는 명확하지 않다, 그러나 여기에서 예를 들어 어쨌든입니다으로이 이전 옵션에 덜 바람직하다 생각 ... "? –

+1

@hbob : 두 가지 접근법의 예를 추가했습니다. 더 자세한 정보가 필요하면 알려주세요. –

+0

좋은 예입니다. 감사합니다! –