2008-09-15 3 views
4

요즘 팀 시스템 테스팅 문제가 발생했습니다. 당신이 MyMethod라는를 테스트하려면비공개 액세서 클래스가 제네릭 제약을 무시합니다

namespace MyLibrary 
{ 
public class MyClass 
{ 
    public Nullable<T> MyMethod<T>(string s) where T : struct 
    { 
    return (T)Enum.Parse(typeof(T), s, true); 
    } 
} 
} 

, 당신이 테스트 프로젝트를 만들 수 있습니다

당신이 다음 클래스가 있다고 가정 : 적어도 다음과 같은 경우에 - 나는 자동으로 생성 접근 클래스는 일반적인 제약을 무시 발견 다음 테스트 방법을 사용하십시오.

public enum TestEnum { Item1, Item2, Item3 } 

[TestMethod()] 
public void MyMethodTest() 
{ 
MyClass c = new MyClass(); 
PrivateObject po = new PrivateObject(c); 
MyClass_Accessor target = new MyClass_Accessor(po); 

// The following line produces the following error: 
// Unit Test Adapter threw exception: GenericArguments[0], 'T', on 
// 'System.Nullable`1[T]' violates the constraint of type parameter 'T'.. 
TestEnum? e1 = target.MyMethod<TestEnum>("item2"); 

// The following line works great but does not work for testing private methods. 
TestEnum? e2 = c.MyMethod<TestEnum>("item2"); 
} 

위의 스니 j의 설명에 언급 된 오류로 테스트를 실행하는 데 실패합니다. 문제는 Visual Studio에서 만든 접근 자 클래스입니다. 당신이 그것으로 갈 경우, 다음과 같은 코드까지 올 것이다 : 당신이 볼 수 있듯이

namespace MyLibrary 
{ 
[Shadowing("MyLibrary.MyClass")] 
public class MyClass_Accessor : BaseShadow 
{ 
    protected static PrivateType m_privateType; 

    [Shadowing("[email protected]")] 
    public MyClass_Accessor(); 
    public MyClass_Accessor(PrivateObject __p1); 
    public static PrivateType ShadowedType { get; } 
    public static MyClass_Accessor AttachShadow(object __p1); 

    [Shadowing("[email protected]")] 
    public T? MyMethod(string s); 
} 
} 

가의 MyMethod라는 메서드의 제네릭 형식 매개 변수에 대한 제약이 없다.

버그입니까? 그게 설계된거야? 그 문제를 해결하는 방법을 누가 압니까?

답변

3

내가 버그에 투표했습니다. 이것이 어떻게 설계 될 수 있는지 나는 모르겠다.

1

내가 모든 것을 확인하지 못했지만,이 호출과 같습니다

TestEnum? e1 = target.MyMethod("item2"); 

는 제네릭 형식의 param T.이 가능한 경우 테스트에 다른 방법을 호출하려고 결정하기 위해 형식 유추를 사용

TestEnum? e1 = target.MyMethod<TestEnum>("item2"); 

다른 결과가 발생할 수 있습니다.

희망 하시겠습니까?

0

msdn에서 제네릭을 사용하여 단위 테스트를 검색하십시오. 이는 알려진 제한 사항입니다. 확실하게 해결해야하므로 Microsoft Connect의 해결 방법에 투표하십시오.

1

버그처럼 보입니다. 해결 방법은 메서드를 internal으로 변경하고 [assembly: InternalsVisibleTo("MyLibrary.Test")]을 테스트중인 클래스를 포함하는 어셈블리에 추가하는 것입니다.

이것은 훨씬 깨끗하게 보이는 단위 테스트를 생성하므로 비공개 방법을 테스트하는 선호되는 방법입니다.

관련 문제