2010-02-18 5 views
4

클래스는 유효하기 전에 항상 특정 멤버가 채워져 있어야합니다. 이를 강화하기 위해 클래스에는 기본 생성자가 없으며 대신 필요한 멤버의 값을 받아들이는 생성자가 있습니다. 지금은 하나가 미래에 추가됩니다, 우리가 생각 나게되도록, 실제로 디폴트 생성자가 없음을 확인하기 위해 테스트를 작성하고 싶습니다NUnit에서 컴파일 할 수없는 코드 테스트하기

public class MyClass 
{ 
    public string Owner { get; protected set; } 

    public MyClass(string owner) 
    { 
    this.Owner = owner; 
    } 
} 

: 설치에서는이 유사하다 하나가없는 이유와 그렇게하는 것의 영향을 고려해야 만합니다. 명백히 테스트에서 기본 생성자를 호출하려고 시도하는 것은 실패하지 않을 것이지만 컴파일되지는 않습니다.

원래 클래스를 수정하지 않고 이러한 종류의 테스트를 수행 할 수있는 좋은 방법이 있습니까? 그렇지 않다면 예외를 throw하는 기본 생성자를 구현할 수 있다고 가정합니다. 저의 유일한 망설임은 기본 생성자를 호출하는 것이 이제 컴파일 가능한 코드가되었다는 것과 그런 코드가 작성되지 않도록 다른 테스트에 의존해야한다는 것입니다.

생각하십니까?

+1

당신이 생각해내는 해결책은 클래스 자체에 누락 된 기본 생성자의 중요성을 문서화하여 나중에 실행될 수도 있고 실행되지 않을 수도있는 테스트에 의존하지 않는 것이 좋습니다. 물론 다음 개발자는 그 주석을 무시할 수도 있습니다 :-) –

+0

테스트는 빌드 서버에서 실행되어야합니다. 따라서 테스트가 실패하면 빌드가 중단됩니다. 개발자가 테스트를 실행하도록하는 것은 항상 잘못된 생각입니다. 지속적인 통합 없이는 단위 테스트가 작동하지 않습니다. – womp

+0

@womp : 동의하지만 빌드 서버에서 실행되거나 개별 테스트가 여전히 활성화/비활성화 될 수는 없으며 이것이 내 요점이었습니다. 프로젝트의 다른 부분의 테스트가 영원히 계속 실행될 것이라는 것을 믿지 않는 것은 불합리하지는 않지만 보장되지는 않습니다. 최소한 수업 시간에 언급 된 내용을 통해 사람들에게 알릴 수있는 모든 노력을 기울이고 있습니다. 미래의 개발자가 특정 테스트의 존재와 관련된 "이유"를 알지 못하기 때문에 테스트 자체만으로는 충분하지 않을 수 있습니다. 모든 기지를 감추는 것이 내 생각이었습니다. –

답변

10

Activator.CreateInstance(typeof(MyClass))을 호출하여 기본 생성자를 실행하고 MissingMethodException이 발생했다고 주장 할 수 있습니다.

[Test] 
[ExpectedException(typeof(MissingMethodException)) 
public void ShouldBeNoDefaultConstructorForMyClass() 
{ 
    Activator.CreateInstance(typeof(MyClass)); 
} 
+0

-1, 왜 거기에 없다고 단언 할 수있을 때 호출할까요? –

+0

+1 - 정확하게 필요한 것. 존에게 대답하려면 어느쪽으로 든 할 수 있습니다. 사람들이 하나 또는 다른 것을 선택할 수 있기 때문에 두 가지 질문에 모두 대답 할 수 있습니다. 왜 당신이 택할 수있는 길이 아니기 때문에 유효한 응답을 DV로 보내겠습니까? – Dracorat

0

당신이 클래스에 대한 노 인수 생성자가 있는지 확인하고

9

나는 기본 생성자를 만드는 것이있을 경우 시험 실패, 그것은 개인 표시하고 거기 문서를 넣어 반사를 사용할 수 있습니다. 그러면 그것을하는 이유가 어딘가에서 숨겨지지 않을 것입니다. 매개 변수없는 생성자를 필요로하는 일부 직렬화 기능을 포기할 것임을 알아야합니다.

+0

단위 테스트는 종종 길가에 떨어지기 때문에 단위 테스트 개념보다이 방법을 선호합니다. 반면 변경하려는 경우 주석이있는 코드가 바로 나타납니다.결국, 당신은이 경우에 기능을 테스트하는 것이 아니라, 프로그래밍 스타일 또는 프로그래밍 규범을 얻는 것입니다. 이것은 단위 테스트를위한 것이 아닙니다. – Nick

+1

두 가지를 모두 선호합니다. 나는 항상 테스트에서 비즈니스 이유를 문서화해야한다고 가정합니다. 테스트에 대한 좋은 점은 빌드를 위반하여 컴플라이언스를 강제하는 것입니다. 문서는 그렇지 않습니다. – womp

5
ConstructorInfo ci = typeof(MyClass).GetConstructor(Type.EmptyTypes); 
Assert.IsNull(ci); 
0

네. 좋은 방법은 리플렉션을 사용하여 try/catch 내에서 매개 변수없는 생성자를 시도하는 것입니다.