2010-10-07 5 views
0

J'ai le test suivant qui vise à s'assurer que le chemin de fichier généré est d'un format spécifique. En utilisant les interfaces fluides de Nunit, comment puis-je m'y prendre?Comment tester un chemin de répertoire qui correspond à un motif/regex spécifique?

J'ai des problèmes avec la regex.

[Test] 
    public void AssetControlPath_ShouldHaveFormat_BaseDir_YYYY_MMM_YYYYMMMDD() 
    { 
     //Arrange 
     var baseDir = "C:\\BaseDir"; 
     var fpBuilder = new FilePathBuilder(new DateTime(2010,10,10), baseDir); 

     //Act 
     var destinationPath = fpBuilder.AssetControlPath(); 

     //Assert 
     // destinationPath = C:\BasDir\2010\Oct\20101010 
    Assert.That(destinationPath, Is.StringMatching(@"C:\\BaseDir\\d{4}\\[a-zA-Z]{3}\\d{8}"));    
    } 

L'erreur de test unité XXX.FilepathBuilderTests.AssetControlPath_ShouldHaveFormat_BaseDir_YYYY_MMM_YYYYMMMDD: Expected: String matching "C:\\BaseDir\\d{4}\\[a-zA-Z]{3}\\d{8}" But was: "C:\BaseDir\2010\Oct\20101010"

Edit: J'ai effectivement changé le test à utiliser @ l'approche de ChrisF. La question reste cependant toujours.

+0

Que devrait correspondre l'expression régulière? – SWeko

+0

BTW, si vous utilisez le symbole @ pour un littéral de chaîne, vous n'avez pas besoin d'échapper la barre oblique inverse, donc @ "C: \ BaseDir \ d {4} \\ [a-zA-Z] {3}] \ d {8} "pourrait être ce dont vous avez besoin. – SWeko

+0

@SWeko - c'est dans le commentaire au-dessus du test. Je l'ai manqué au début aussi. – ChrisF

Répondre

2
@"C:\\BaseDir\\d{4}\\[a-zA-Z]{3}]\\d{8}" 
//        /\ extra bracket 

vous avez également un problème avec \ échapper, vous avez besoin \\\d{4} et \\\d{8}, vous voulez faire correspondre xxx\20101010 et non xxx20101010. Le correctif suivant correspond:

var str = @"C:\BaseDir\2010\Oct\20101010"; 
var re = new Regex(@"C:\\BaseDir\\\d{4}\\[a-zA-Z]{3}\\\d{8}", RegexOptions.IgnoreCase); 
var result = re.IsMatch(str); // true 
+0

+1 impressionnant. Je vais rester avec l'approche de ChrisF à ce test pour les raisons qu'il a mentionnées. – Ahmad

0

Vous avez un crochet carré de fermeture supplémentaire !! enlever ça et ça devrait aller.

3

A String.Split avec \ comme le caractère partagé, puis vérifiez que vous obtenez le bon nombre d'éléments (5) et que chaque élément est la valeur attendue pourrait être:

a) être plus clair dans ce que l'intention de le test est et

b) plus facile à entretenir.

+0

ou utilise des groupes nommés dans Regex et effectue un test sur ceux-ci. –

+0

+1 pour la suggestion de tester cela d'une manière différente. – Ahmad

Questions connexes