2010-07-08 14 views
2

J'ai une page Web qui montre différents messages selon différentes conditions. Je souhaite tester cette unité afin de configurer mon projet pour utiliser MVVM et tester mon ViewModel.Messages de test d'unité

Mon ViewModel formate maintenant différents messages. Comment puis-je tester cela? Je ne veux pas reproduire toutes les chaînes, il semble sale ...

Maintenant, je fais ceci:

void test() 
{ 
    string message = _viewModel.DoWork(); 
    Assert.AreEqual(message, Resource.MyResourceText); 
} 

Mais ceci est un cas simple. Maintenant, j'ai des chaînes dynamiques contenant la date du système et d'autres variables.

Comment puis-je tester cela de manière élégante? Merci!

+1

Vous pouvez donner encore un extrait d'exemple - il est garanti de vous donner de meilleures réponses –

Répondre

1

Je résolus de cette façon:

class MyTestClass 
{ 
    void test() 
    { 
     string message = _viewModel.DoWork(); 
     MyAssert.StringFormatConforms(message, Resource.MyResourceText); 
    } 
} 

class MyAssert 
{ 
    public static void StringFormatConforms(string stringToCheck, string format) 
    { 
     // replace {0}, {1} with .* 
     string regex = "^" + Regex.Replace(format, "{[0-9]+}", ".*") + "$"; 
     bool conforms = Regex.IsMatch(stringToCheck, regex); 
     if (!conforms) 
      throw new AssertFailedException(String.Format("The string {0} does not conforms to format: {1}", stringToCheck, format)); 
    } 
} 

De cette façon, je peux vérifier que mon message "salut ric" doit être conforme à "salut {0}"

2

Si vous ne faites que reproduire des chaînes dans vos appareils d'essai, placez-les toutes dans un enum ou class.

public static class StatusMessage 
{ 
    public static readonly string SavedSuccessfully 
     = "Item was successfully saved."; 
    public static readonly string DuplicateRecord 
     = "This record is a duplicate."; 
    public static readonly string SubscriptionExpired 
     = "Your subscription has expired; please renew now."); 
} 

Maintenant, votre viewmodel peut effectuer sa logique et retourner l'un des StatusMessages:

public class SomeViewModel 
{ 
    ... 

    public string Status 
    { 
     get { return StatusMessage.SavedSuccessfully; } 
    } 

    ... 
} 

Dans votre test:

Assert.AreEqual(StatusMessage.SavedSuccessfully, viewmodel.Status); 
+0

c'est génial, mais j'utilise déjà le fichier de ressources (voir ma question mise à jour). Le problème est que j'utilise des chaînes dynamiques ... – Ricibald

+0

@Ricibald - peut être un peu risqué dans un test unitaire, mais vous pouvez utiliser des expressions régulières ou 'string.Contains()' pour valider le message. – Jay

1

Je vais aller avec ce que vous faites actuellement ou peut être ce que @Jay a suggéré.

Mais, je ne comprends vraiment pas quand vous dites,

Maintenant, j'ai des chaînes dynamiques contenant la date du système et d'autres variables.

La chaîne attendue toujours A à hardcoded afin de tester l'unité elle. Vous ne devriez jamais utiliser un calcul dans un test unitaire. Vous devez définir un scénario (date, autres variables) et vous savez alors quelle sera votre chaîne attendue. Vous allez ensuite le coder en dur. Si vous souhaitez tester la même méthode pour différentes chaînes, vous pouvez utiliser l'attribut TestCase dans l'attribut nunit ou RowTest dans MBUnit.

+0

ok, mais de cette façon, il semble que je répète l'implémentation sous-jacente. Je veux tester ma classe en tant que boîte noire – Ricibald

+0

Vous allez répéter l'implémentation si vous avez la logique dans votre code et non en ayant la chaîne attendue. Quand je dis que vous devez définir un scénario, cela signifie que vous venez de définir certaines variables. –