2009-09-29 5 views
0

J'ai tendance à écrire beaucoup de test en utilisant boost/unit_test et je tendance à générer beaucoup de données const - par exempleComment générer des données const ou test en C#?

#include <vector> 
#include <map> 
#include <string> 

#include <boost/assign.hpp> 
#include <boost/assign/list_of.hpp> 
#include <boost/assign/std/vector.hpp> 
#include <boost/assign/std/map.hpp> 

namespace ba = boost::assign; 
using namespace std; 

const vector<int> my_vector_of_ints = ba::list_of(15)(23)(43)(22)(5)(78); 
const map<int, string> my_map = ba::map_list_of(5, "abc")(7, "ddd"); 

etc., etc., etc.

Comment puis-je faire pour ce genre de choses dans C#?

Répondre

3

Essayez quelque chose comme ceci:

readonly List<int> myListOfInts 
    = new List<int> { 15, 23, 43, 22, 5, 78 }; 
readonly Dictionary<int, string> myMap 
    = new Dictionary<int, string> { { 5, "abc" }, { 7, "ddd" } }; 

maintenant C# 's const ne signifie pas la même chose que C++ est const vous aurez donc besoin de se rendre compte que ces instances sont mutables. J'ai marqué ces champs comme readonly qui est à peu près aussi proche que vous allez obtenir.

+0

droit, comment puis-je aller sur la création const struct etc? – Maciek

+0

Vous ne pouvez pas utiliser le mot-clé var pour déclarer les membres de la classe - seules les variables de la méthode locale. – LBushkin

2

En C# 3, vous pouvez utiliser collection initializers:

public static class TestData 
{ 
    public static readonly List<int> my_vector_of_ints 
     = new List<int> { 15, 24, 43, 22, 5, 78 }; 

    public static readonly Dictionary<int,string> my_map 
     = new Dictionary<int,string> { {5, "abc"}, {7, "ddd" } }; 
} 
1
static readonly ReadOnlyCollection<int> MyInts = new ReadOnlyCollection<int>(new int[] { 
    15, 23, 43, 22, 5, 78 
}); 

Malheureusement, .Net n'a pas seulement lu le type dictionnaire.

Vous pouvez utiliser un dictionnaire mutable comme ça, mais si vous exposez le dictionnaire à tout autre code, l'autre code sera en mesure d'ajouter ou de supprimer des entrées en elle.

static readonly Dictionary<int, string> MyDictionary = new Dictionary<int, string> { 
    { 5, "abc" }, 
    { 7, "ddd" } 
}; 

Le mot-clé readonly dans la déclaration signifie que la variable ne peut être réaffecté (comme un pointeur const en C++, qui ne peut être réaffecté à pointer vers quelque chose d'autre). Cela ne signifie pas que l'objet ne peut pas être muté. Cependant, ReadOnlyCollection est immuable par conception.

EDIT: Pour faire const struct, faites votre structs immuable (Ne pas un ensemble de méthodes, etc.). C'est une bonne pratique en général pour les structures.

1

Jetez un oeil à Autofixture. Cela peut considérablement simplifier la configuration de vos tests unitaires.

1

Vous pouvez générer des données de test en utilisant NBuilder

Grâce à une interface fluide, extensible, NBuilder vous permet de créer rapidement des données de test, en attribuant automatiquement des valeurs aux propriétés et les champs publics qui sont de type de la construction dans les données .NET types (par exemple, ints et cordes). NBuilder vous permet de remplacer les propriétés qui vous intéressent en utilisant des expressions lambda.

Questions connexes