2008-09-15 7 views
4

Ces jours-ci, j'ai rencontré un problème avec les tests unitaires Team System. Je trouve que la classe accesseur créée automatiquement ne tient pas compte des contraintes génériques - au moins dans le cas suivant:La classe Private Accessor ignore la contrainte générique

Supposons que vous avez la classe suivante:

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

Si vous voulez tester MyMethod, vous pouvez créer un projet de test avec la méthode de test suivante:

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

L'exécution du test échouera avec l'erreur mentionnée dans le commentaire de l'extrait ci-dessus. Le problème est la classe accesseur créée par Visual Studio. Si vous allez dans, vous proposerez au code suivant:

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

Comme vous pouvez le voir, il n'y a pas de contrainte pour le paramètre de type générique de la méthode MyMethod.

Est-ce un bug? Est-ce que c'est par conception? Qui sait comment contourner ce problème?

Répondre

3

Je vote bug. Je ne vois pas comment cela pourrait être par conception.

1

Je n'ai pas vérifié tout, mais il semble que l'appel à:

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

utilise l'inférence de type pour déterminer le type générique T. Essayez d'appeler param différemment la méthode dans le test si possible:

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

Cela peut donner des résultats différents.

Espérons que ça aide!

0

Recherche de tests unitaires avec des génériques sur msdn. Ceci est une limitation connue. Votez pour une résolution sur Microsoft Connect, car il est vraiment besoin de résoudre.

1

Cela ressemble à un bug. La solution de contournement consiste à modifier la méthode à internal et ajouter [assembly: InternalsVisibleTo("MyLibrary.Test")] à l'assembly contenant la classe sous test.

Ce serait ma façon préférée de tester des méthodes non-publiques car elle produit beaucoup de tests unitaires à la recherche de nettoyeur.

Questions connexes