2009-05-19 2 views
1

테스트하려는 클래스에 문제가 있습니다. 개인 열거 형을 선언했으며 코드의 일반 사전에이 열거 형을 사용하고 있습니다. 이 열거 형은이 클래스 외부에서는 의미가 없지만 개인 메서드에서 사용됩니다. 코드를 생성 할 때 접근자는 generic 사전 형식으로 작성되지만 테스트를 사용하려고하면 잘못된 캐스트 예외가 발생합니다.Visual Studio에서 개인 형식을 포함하는 제네릭을 사용하는 방법 단위 테스트

MyClass_Accessor target = new MyClass_Accessor(); 
Dictionary<MyClass_Accessor.MyEnum, long> dictionary = new Dictionary<MyClass_Accessor.MyEnum, long>(); 
dictionary.Add(MyClass_Accessor.Myenum.EnumValue, 1); 
target.Method(dictionary); //Throws invalid cast exception here. 

예외 접근 => 열거의 일반적인 사전 긴 길이 MyClass에 => ENUM으로 변환 할 수 없다는 것이다.

내 작업 클래스을 변경하는 것 외에는이 방법을 테스트 할 수있는 방법이 있습니까?

답변

4

InternalsVisibleTo 어셈블리 특성을 사용하고 내부 특성을 내부 특성으로 변경할 수 있습니다. (개인 열거 형을 내부 열거 형으로 변경할 수없는 경우이 기능은 작동하지 않지만 대개 수용 가능합니다.)

Assembly Test라는 단위 테스트를 거친 AssemblyA라고하는 AssemblyA가 있다고 가정하면, 및 AssemblyAIntegTest 테스트 통합, 당신은 당신의 AssemblyInfo.cs에 다음과 스틱 수있는 파일 : 당신이 기본 어셈블리에 서명하는 경우

using System.Runtime.CompilerServices; 

// ... 

[assembly: InternalsVisibleTo("AssemblyATest")] 
[assembly: InternalsVisibleTo("AssemblyAIntegTest")] 

, 당신은 또한 완전한, 배양 및 테스트 어셈블리에 서명하고 제공해야합니다 기본 키 어셈블리 이름.

+0

사전 형식이 지정되지 않고 실제 형식 인 것이기 때문에이 방법이 효과가 있다고 가정합니다. 이 일을 0 일로하겠습니다.하지만이 방법은 클래스의 목적을 변경하지 않고도 작동 할 수 있지만, 지원되는 방법을 찾으면 좋을 것입니다. – Spence

+0

Microsoft는 단위 테스트를 지원하기 위해 InternalsVisibleTo 특성을 추가했습니다. 주요 목표 중 하나 였고 Microsoft의 자체 라이브러리에서 그 목적을 위해 사용되었습니다 (예를 들어, Enterprise Library 3.0 및 4.0, 예를 들어 사용 방법에 대한 예제가 필요한 경우). – jrista

0

나는 그 질문이 나에게 분명하지 않다는 것을 인정해야한다. 그러나 공개 호출자를 통해 개인 방법을 테스트해야하는 것처럼 보입니다.

대부분의 경우 TDD를 사용할 때 테스트를 충족시키는 공용 메서드를 만든 다음 필요한 경우 개인 테스트에서 리팩터링합니다.

+0

나를위한 TDD 없음 : '(.기존 코드베이스에 테스트를 추가하라는 메시지가 표시되었습니다. 여기에서 학습 곡선이 모두 있습니다. 그래서 기본적으로이 함수에 대한 작동 테스트를 남겨 둘 방법이 없습니다. 호출을 리팩터링하면 변경해야하는 경우에도 테스트를 잃게됩니다. – Spence

0

개인적인 정의가있는 private 함수를 호출하지 않았지만 코드를 보면 사전 개체의 유효한 값을 선택하지 않은 것처럼 보입니다.

코드가 다음과 같지 않아야합니까?

target.Method(dictionary[0]); 

좋아, 아래에 의견을 남기십시오.

다음 코드는 클래스의 개인 메소드 (PaDeviceManager)를 사용한 테스트에서 가져온 것으로 귀하의 요구 사항에 맞출 수 있습니까?

PaDeviceManager paDeviceManager = PaDeviceManager.Create; 
PrivateObject param0 = new PrivateObject(paDeviceManager); 
PaDeviceManager_Accessor target = new PaDeviceManager_Accessor(param0); 
PaDeviceManager_Accessor(); 
+0

메서드는 값의 사전을 가져 와서 생각합니다. 그것의 공유 상태로. 사전의 값을 변환 할 것으로 기대합니다. – Spence

0

필자는 자신의 상황에 따라 수행해야하는 테스트임을 인정할 것입니다.이 경우, jrista의 대답은 따라야합니다 (InternalsVisibleTo).

하지만 단위 테스팅에서는 일반적으로 클래스의 비공개 API를 테스트한다고 생각하지 않습니다. 이 열거 형이 클래스에 대해 private이므로 클래스에 내부적으로 만 사용되면 모든 단위 테스트에서도 발생하지 않아야합니다.

단위의 목적은 클래스의 공개 (가상/추상 보호 된 API 포함) API가 예상대로 작동하는지 확인하기 위해 테스트합니다. 이 개인 열거 형과 같은 구현 세부 사항에 의존하는 테스트를 포함시킴으로써 근본적으로 향후 구현을 변경할 수 없도록 만듭니다 (예 : 열거 형을 필요로하지 않을 수도있는).

관련 문제