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?
"Fermé comme ne le sera pas"? Fantastique. –