2010-11-27 14 views
0

Question liée au TDD.NUnit vérifie que la propriété est une collection

Je peux vérifier que les années de propriété est List<int>:

Assert.IsInstanceOf<List<int>>(viewModel.Years); 

Mais des années peuvent être List<int> ou objet qui contient List<int>.

Par exemple

public class ViewModel 
{ 
    public List<int> Years {get;set;} 
    or 
    public object Years {get;set;} 
} 

Je demande cela parce que pendant le codage VS génère la propriété Années d'objet de type.

Une solution possible peut être:

Assert.AreEqual(yearsList, (List<int>)viewModel.Years); 

Quand je vais générer des années, il sera de type List<int>.

Existe-t-il une autre façon de s'assurer que les années sont correctes?

Répondre

1

La meilleure solution pour moi est la suivante:

Assert.IsTrue(viewModel.Years is List<int>) 

mais ça ne marche pas :(même dans ReSharper

seule façon fonctionne et agréable à regarder est le suivant:

Assert.IsNotNull(viewModel.Years as List<int>) 

FYI
ReSharper n'est pas non plus assez intelligent pour déterminer le type de droite

+0

Merci. Nice avatar :) –

+0

Cela fonctionne, mais ce n'est pas évident ... –

+0

vous êtes les bienvenus :) –

2

Contourner la question de savoir si vous devriez ou non tester cela, au minimum, au lieu de tester que Years est List<int>, vous devriez tester qu'il s'agit d'un IList<int>. Deuxièmement, avez-vous vraiment besoin de quelque chose d'aussi fort? Pouvez-vous sortir avec ICollection<int> ou IEnumerable<int>. Vous devriez tester le type le plus faible dont vous avez besoin.

Alors, je dirais:

static class ObjectExtensions { 
    public static bool Implements(this object o, Type type) { 
     Contract.Requires<ArgumentNullException>(o != null); 
     Contract.Requires<ArgumentNullException>(type != null); 
     Contract.Requires<ArgumentException>(type.IsInterface); 
     return o.GetType() 
       .GetInterfaces() 
       .Contains(type); 
    } 
} 

Utilisation:

[Test] 
public void Years_is_an_object_that_implements_ilist_int() { 
    // viewModel is ViewModel 
    Assert.IsNotNull(viewModel.Years); 
    Assert.AreEqual(true, viewModel.Years.Implements(typeof(IList<int>)); 
} 
+0

Si je comprends bien. La question est en fait: Comment forcer VS à générer le bon type pour le talon de la propriété au lieu de l'objet. –

+0

@Sergey Mirvoda: La question est intitulée "NUnit ...." et est étiqueté "tdd" et "nunit". Je ne pense pas que cela concerne Visual Studio. – jason

+0

C'est VS + NUnit + TDD. –

0

Je pris le meilleur des deux réponses:

Ma solution

namespace Tests 
{ 
    public class AssertExt 
    { 
     public static void IsOfType<T>(T entity) 
     { 
     } 


     public static void IsOfType<T>(T entity, string message) 
     { 
     } 
    } 
} 

Je peux maintenant écris quelque chose comme ça:

AssertExt.IsOfType<Dictionary<int, string>>(viewModel.PrintFor); 

Et VS générera la propriété du type correct.

Malheureusement, je ne peux pas créer d'extension pour la classe Assert de NUnit.

Je ne sais pas pourquoi il ne me permet pas d'avoir quelque chose comme

Assert.IsOfType<Dictionary<int, string>>(viewModel.PrintFor); 

Peut-être que le problème est le constructeur protégé du Assertion?