2012-07-12 1 views
2

J'ai l'erreur suivante lors de l'exécution du code de test. Comment contourner le problème? J'utilise le MStest intégré de Visual studio 2010 Premium.Impossible de lancer List`1 [MyClass] 'pour taper List`1 [MyClass_Accessor]'?

 
Test method TestProgram.myProgramTest.GetTypeListTest threw exception: 
System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List`1[MyProgram.MyClass]' to type 'System.Collections.Generic.List`1[MyProgram.MyClass_Accessor]'. 

Méthode à tester:

public class MyProjectClass { 
    private List<MyClass> GetTypeList() 
    { .... 
    } 
} 

class MyClass {....} // A POCO class 

Code d'essai (la plupart du code est automatiquement généré par Visual Studio):

[TestMethod()] 
[DeploymentItem("myProgram.exe")] 
public void GetTypeListTest() 
{ 
    MyProjFile_Accessor target = new MyProjFile_Accessor(); 
    var actual = target.GetTypeList(); 
    Assert.IsTrue(actual.Count > 2); 
} 

Je ne sais vraiment pas pourquoi question a été votée deux fois, tout autre code est soit sans rapport avec le problème ou généré automatiquement par Visual Studio
C'est une définition de classe assez simple. Et l'appareil de test a été créé à l'aide de l'assistant VS 2010. La méthode juste retour MyClass peut passer le test. Le problème est la méthode avec le type de retour de List<MyClass>.

+0

Est-ce que MyClass_Accessor hérite de MyClass? Actuellement, vous essayez de prendre une liste de pommes et de la lancer comme une liste d'oranges. Même si MyClass_Accessor: MyClass, vous ne pouvez pas convertir en une liste (comme il a des propriétés en lecture/écriture) Regardez les mots-clés 'in' et' out' de C# 4 pour plus d'informations sur le casting, la co- et contra-variance – James

+0

code jamais jeté à 'List '? Cette distribution n'est pas possible, ne supporte pas la variance générique. – CodesInChaos

+0

On dirait que vous avez besoin d'examiner et peut-être réparer l'accesseur (généré?). Avez-vous modifié les interfaces _après_ la génération des premiers cas de test? –

Répondre

4

La classe MyClass n'a aucun modificateur d'accès et C# utilise le modificateur d'accès internal par défaut.

Interne signifie que la classe est accessible uniquement à l'intérieur de son assemblage.

Les tests unitaires sont généralement implémentés dans un assemblage séparé et ne peuvent pas utiliser MyClass. Les tests MS ont généré une classe MyClass_Accessor qui est essentiellement une enveloppe qui utilise la réflexion pour fournir un accès à la classe elle-même ainsi qu'à ses méthodes.

Changez la déclaration en public class MyClass {....} et générez à nouveau le test unitaire (ceci est nécessaire pour indiquer à MS Test que la classe _Accessor n'est pas nécessaire).

Questions connexes