Question

Je voudrais moquer des données d'objet, pas eux-mêmes des objets. En d'autres termes, je voudrais créer une collection d'objets n et le passer à une fonction qui génère des chaînes de données et de chiffres aléatoires. Y at-il de le faire? Pensez-y comme Lorem Ipsum pour les données d'objet. Les contraintes autour des plages numériques, etc. ne sont pas nécessaires, mais serait un bonus.

Était-ce utile?

La solution

La première chose que je pensais quand je lis votre question était QuickCheck, un outil de test pour Haskell. Dans QuickCheck vous spécifiez les propriétés (invariants) que votre fonction doit avoir, et vous pouvez spécifier des plages valides pour les entrées (plus un groupe plus de fonctionnalités) et QuickCheck génère un tas de données d'entrée aléatoire et le jeter à votre fonction et vérifier aussi voir si la sortie correspond à la spécification. Fouiner un peu, j'ai découvert il y a un port F # de si QuickCheck existe dans le monde .net:

http://fscheck.codeplex.com/

Il y a aussi un projet de recherche MS Pex qui pourrait être proche de ce que vous pensez:

http://research.microsoft.com/en-us/projects/Pex /

« ... Pex trouve les valeurs entrées-sorties intéressantes de vos méthodes, que vous pouvez enregistrer comme une petite suite de tests avec une large couverture de code. Microsoft Pex est un add-in Visual Studio pour tester des applications .NET Framework ».

Je l'ai pas utilisé avant, mais il semblait être il est bon pour générer des données de cas de pointe qui exerce toutes les branches d'une fonction. Il analyse en fait une fonction plutôt que de simplement lancer des choses vraiment au hasard dans ce domaine.

Autres conseils

Il semble également être un port .NET de la gemme Faker Ruby, qui obtient beaucoup d'utilisation pour le haubanage des objets de données de faux en Ruby. Je ne l'ai pas utilisé, mais il pourrait être intéressant de regarder dans:

https://github.com/slashdotdash/faker-cs

Je suis surpris que personne n'a mentionné AutoFixture encore:

[TestMethod]
public void IntroductoryTest()
{
    // Fixture setup
    Fixture fixture = new Fixture();

    int expectedNumber = fixture.CreateAnonymous<int>();
    MyClass sut = fixture.CreateAnonymous<MyClass>();
    // Exercise system
    int result = sut.Echo(expectedNumber);
    // Verify outcome
    Assert.AreEqual<int>(expectedNumber, result, "Echo");
    // Teardown
}

Vous pourriez installer une classe ObjectRandomizer qui prend un tableau d'objets, utilise la réflexion pour examiner l'objet pour les membres privés, puis utiliser la réflexion pour définir une valeur aléatoire pour ce membre. Cela ne fonctionne que si vous ne faites pas ce que les regards de données aléatoires comme par objet.

Sinon, vous pouvez construire un ensemble de classes pour chaque objet de données qui génère des données aléatoires pour eux. Cela pourrait bien fonctionner si vous ne voulez pas inclure les méthodes de génération aléatoire à l'intérieur des ensembles réels. Par exemple, si vous aviez une classe Person, vous pourriez avoir une classe PersonRandomizer dans un ensemble de test. Dans votre classe de test (ou dans une classe Randomizer), Vous pouvez ensuite utiliser la réflexion pour trouver un type PersonRandomizer, et si elle existe, appel PersonRandomizer.Randomize(Person p).

Si vous allez avec la suggestion de yahya, je suggère la création d'un IRandomizable d'interface pour les objets qui randomization soutien ou les marquer avec une nouvelle Randomizable d'attributs que vous pouvez détecter lors de l'exécution.

Pour mon retour, je viens d'ajouter tester une méthode pour toutes les classes que je crée qui fait cela et appelle randomize. Chaque classe sait quoi devrait ressembler les données juridiques pour un objet de cette classe comme. Après avoir créé l'objet simplement appeler sa méthode randomize pour le remplir avec maquette aléatoire des données. Vous pouvez également ajouter des méthodes spécialisées pour générer des chaînes de données aléatoires ou des chiffres en fonction des contraintes et ces méthodes spécialisées peuvent être partagées entre toutes vos classes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top