2009-07-15 10 views
1

Je veux écrire des tests pour vérifier l'existence (et d'autres choses) de certains fichiers qui seront livrés avec notre projet.Est-il possible d'avoir des éléments de déploiement dynamiques à la volée?

C'est ce que j'ai en ce moment:

[DeploymentItem("1.pdf")] 
[DeploymentItem("2.pdf")]  
public class DoFilesExist 
{ 
    List<string> _Files; 

    public DoFilesExist() 
    { 
     _Files = new List<string>(); 
     _Files.Add("1.pdf"); 
     _Files.Add("2.pdf"); 
    } 

    delegate void fileTest(string fileName); 

    void Map(fileTest test) 
    { 
     foreach (string file in _Files) 
     { 
      test(file); 
     }    
    } 

    [TestMethod] 
    public void TestExists() 
    { 
     Map(x => Assert.IsTrue(File.Exists(x), x + " doesn't exist")); 
    } 
} 

Comme vous pouvez le voir, quand je veux ajouter un autre fichier à tester, je dois ajouter à la [DeploymentItem] et la _files Liste

Existe-t-il un moyen de modifier dynamiquement les objets DeploymentItems? Ou pour les attraper pendant l'exécution. Je vais probablement avoir plus de 30 fichiers ici, et je ne veux pas deux listes.

Merci d'avance!

Répondre

4

On dirait que vous testez surtout si [DeploymentItem] œuvres ... après tout - il n'est pas [DeploymentItem] qui définit votre réelle déploiement. Personnellement, c'est quelque chose que je déteste à propos de MSTest; Les projets .NET déjà ont un moyen de définir les données de déploiement - le projet! En introduisant une seconde méthode, elle introduit à la fois la duplication et le risque. Une des raisons pour lesquelles j'utilise NUnit au lieu de MSTest, même si j'ai une licence VSTS </rant>.

Re la question; vous pourriez utiliser la réflexion pour regarder les marqueurs DeploymentItem, mais je ne suis pas sûr de ce que c'est tester, autre que le cadre de test lui-même ...

+0

Cet exemple simple teste le framework ... mais, je ferai plus qu'un simple appel File.Exists(). Je voulais simplifier l'exemple pour la question. – Jeremiah

+0

Comment obtenez-vous le DeploymentItem par la réflexion? – Jeremiah

+1

GetType(). GetCustomAttributes (typeof (DeploymentItemAttribute)) –

0

Une possibilité est de mettre vos fichiers dans un sous-répertoire, puis vous pouvez avoir la référence de l'élément de déploiement qui par exemple

[DeploymentItem("files\"] 
public class Test 
{ 
} 

Vous devrez peut-être marquer chaque fichier avec le paramètre CopyAlways également - voir la question principale pour plus de détails.