2012-04-25 6 views
1

열 기반 데이터베이스의 데이터 필드는 DataField 클래스에 매핑됩니다. 각 데이터 필드 객체에서 GetValue<T>() 메소드를 호출 할 수 있습니다.단위 테스트 용으로 잘못된 매개 변수 클래스를 만드는 추상 방법

T이 잘못된 유형 인 경우 예외가 발생합니다. 단위 테스트에서 어떤 유형을 전달해야합니까? 불법 유형을 전달하면 예외가 발생하는지 테스트합니다. 내 마음 속에서 다음에 알려진 불법 유형 은요? 아니면 좀 더 추상적 인 접근 방식이 있습니까?

따라서 모든 유형은 예외가 발생하면 예외를 throw해야합니다. 그래서 나는 가짜 타입이 필요 하겠지, 그렇지?

는 순간 내 단위 테스트는 다음과 같습니다

[Fact] 
public void If_T_is_illegal_type_an_exception_gets_thrown() 
{ 
    _dataField = new DataField(_params); 
    Assert.Throws<Exception>(() => _dataField.GetValue<Type>()); 
} 
+2

불법 유형의 예는 무엇입니까? 컴파일러는 단위 테스트가 아닌이 작업을 올바르게 수행 할 수 있습니다. – yamen

+0

내 게시물을 업데이트했습니다. –

답변

2

그 단위 테스트는 모든 코드 경로를 통해 얻으려고 노력하고 정확한 동작을 보장한다 기억하십시오. 합계 6 개의 테스트가 있어야합니다. 하나는 유효한 유형 5 개, 다른 하나는(현재 보유하고있는 것)으로 최종 코드 경로를 처리해야합니다. 왜 당신이 더 추상적 인 것을 필요로하는지 확신 할 수 없습니다. 이 런타임이 아닌 컴파일 시간에 시험이되도록

당신은 명시 적 변환 및 캐스팅을 사용하는 것이 좋습니다 : http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.100).aspx

+0

알겠습니다. 나는 단지 표준 또는 종류의 종류가 있다고 생각했다. * "다른 유형"*을 나타내는 유형. 노골적인 변환은 매우 멋지게 보입니다.이 객체들을 다른 일반적인 메소드 인 : (T) _dataField.GetValue ()'에 캐스팅 했음에도 불구하고. 그러나 명시 적 변환은 'T'와 함께 작동하지 않습니다. 왜냐하면 컴파일 시간 상수가 아니기 때문입니다. 맞습니까? –

0

을 현재 당신은 당신의 코드가 typeof(T) 다섯 번 전화 5 개 비교를 할 것입니다 GetValue<bool>() 호출하는 경우. 그런 다음 boxed 부울 값을 object로 반환합니다. 그리고 최악의 경우는이 메서드의 시그니처가 어떤 타입이 허용되고 예외를 던질 지에 대해서는 아무 것도 말하지 않는다는 것입니다. GetValue<decimal>()으로 전화 할 수 있습니까? 모르겠다. 허용되지 않는 경우 런타임 예외를 시도해야합니다.

필요한 종류의 오버로드 된 메서드를 만드는 고려해

bool GetBooleanValue() 
decimal GetDecimalValue() 

이 그것을 반환 할 수 유형을 완벽하게 설명합니다. 내부에 체인이 있어도 길지 않습니다. 호출자는 객체를받지 않습니다. 그리고 당신은 질문없이이 방법들 각각에 대해 시험 할 것입니다.

+0

그건 우리 프로젝트에 맞지 않습니다. 우리는 실제로 우리의 DataFields에서 OurUIDataFields로 데이터를 추출합니다. OurUIDataFields 클래스는 일반적입니다. 과부하를 만들려면 T가 넘는 다른 스위치를 호출해야합니다. DataField를 제네릭 클래스로 리팩터링하는 것이 더 나은 방법이라고 생각합니다. –

0

위에서 언급했듯이 지원되는 각 유형에 대해 하나의 테스트와 지원되지 않는 유형에 대해 하나의 테스트만으로 충분할 것입니다.

내가 언급 한 한 가지 사실은 예외가 오류에 대한 유일한 예상 결과가 아니라는 것입니다. 오류가 기록 된 것을 어떻게 확인하고 있습니까?
이 방법이 있습니까?
그렇지 않다면 원하십니까? 또한

, 완전히 원치 않는 코드 검토 포인트 ... 왜

if (typeof(T) == typeof(bool)) return ValueBoolean == true; 

대신

if (typeof(T) == typeof(bool)) return ValueBoolean; 

앨런.

+0

DataField 클래스에서 정적 로거 모의를 만듭니다. 'Log.Error()'가 호출 될 때 나는이 호출을 잡아 내 단위 테스트에서 bool'errorFired' 변수를 설정합니다. 'return ValueBoolean == true' : 나는 이것을 인식했다. 이런 종류의 코드는 ReSharper를 통해 제거됩니다. –

+0

좋은 소리입니다. 예제 코드에서 확인되지 않았으므로 언급하겠다고 생각했습니다. – AlanT

관련 문제