2008-09-15 86 views
4

这些天来,我遇到了一个Team System Unit Testing问题。我发现,自动创建访问器类忽略泛型约束 - 至少在以下情况:Private Accessor类忽略通用约束

假设你有下面的类:

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

如果你想测试的MyMethod,您可以创建一个测试项目使用以下测试方法:

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"); 
} 

运行测试将失败,并显示以上代码段的注释中提到的错误。问题是由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

我投票的bug。我不明白这是如何设计的。

1

我没有验证一切,但它看起来像调用:

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

使用类型推断来确定泛型类型PARAM T.尝试不同的调用方法在测试如果可能的话:

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

这可能会产生不同的结果。

希望有帮助!

0

使用msdn上的泛型搜索单元测试。这是一个已知的限制。投票决定Microsoft Connect,因为它肯定需要解决。

1

看起来像一个错误。解决方法是将方法更改为internal,并将[assembly: InternalsVisibleTo("MyLibrary.Test")]添加到包含待测试类的程序集。

这将是我首选的测试非公开方法的方式,因为它产生更清晰的单元测试。