Domanda

Mi piacerebbe mock up dati oggetto, non il loro oggetti. In altre parole, vorrei generare un insieme di n oggetti e passare in una funzione che genera stringhe di dati e numeri casuali. C'è qualcosa da fare questo? Pensate a come un Lorem Ipsum per i dati oggetto. Vincoli vicino intervalli numerici ecc non sono necessari, ma sarebbe un bonus.

È stato utile?

Soluzione

La prima cosa che ho pensato quando ho letto la tua domanda era QuickCheck, uno strumento di test per Haskell. In QuickCheck si specifica proprietà (invarianti) che la funzione deve avere, ed è possibile specificare intervalli validi per gli ingressi (oltre a un gruppo più funzioni), e QuickCheck genererà una serie di dati di input casuale e gettarlo a vostra funzione e controllare anche vedere se l'uscita corrisponda alle specifiche. Curiosare un po 'ho scoperto che c'è un porto # F di esso in modo QuickCheck esiste nel mondo .net:

http://fscheck.codeplex.com/

C'è anche un MS Progetto di ricerca Pex che potrebbe essere vicino a quello che si sta pensando di:

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

"... Pex trova valori di input-output interessanti dei tuoi metodi, che possono essere salvati come una piccola suite di test con una copertura alta codice. Microsoft Pex è un Visual Studio add-in per testare le applicazioni .NET Framework."

Non ho usato prima, ma sembrava che è un bene per i dati caso limite di generazione che esercita qualsiasi e tutti i rami di una funzione. Analizza in realtà una funzione piuttosto che gettare roba veramente casuale a questo.

Altri suggerimenti

Ci sembra anche essere una porta NET del Faker gemma Ruby, che ottiene un sacco di utilizzare per manovre oggetti di dati falsi in Ruby. Non ho usato, ma forse vale la pena guardare in:

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

Sono sorpreso che nessuno ha menzionato AutoFixture ancora:

[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
}

Si potrebbe configurare una classe ObjectRandomizer che prende un array di oggetti, utilizza la riflessione per esaminare l'oggetto per i soci privati, e quindi utilizzare la riflessione per impostare un valore casuale per quel membro. Questo funziona solo se non si cura di ciò che gli sguardi di dati casuali come per oggetto.

In alternativa, si potrebbe costruire un insieme di classi per ogni oggetto di dati che genera dati casuali per loro. Questo potrebbe funzionare bene se non si desidera includere i metodi casuali generazione all'interno delle assemblee attuali. Ad esempio, se si ha una classe Person, si potrebbe avere una classe PersonRandomizer in un montaggio di prova. Nella tua classe di test (o in una classe Randomizer), È quindi possibile utilizzare la reflection per trovare un tipo PersonRandomizer, e se esiste, chiamata PersonRandomizer.Randomize(Person p).

Se si va con il suggerimento di Yahya, suggerisco la creazione di un IRandomizable un'interfaccia per gli oggetti che supportano la randomizzazione o marcatura con un nuovo Randomizable attributo che è possibile rilevare in fase di esecuzione.

Per il mio test ho solo aggiungere un metodo per tutte le classi creo che fa questo e lo chiamo Randomize. Ogni classe sa quali i dati legali per un oggetto di quella classe dovrebbe essere simile. Dopo aver creato l'oggetto semplicemente chiamare il suo metodo randomize per popolarlo con finto casuale il backup dei dati. Si potrebbe anche aggiungere metodi specializzata per generare stringhe di dati casuali o numeri sulla base dei vincoli e questi metodi specializzati possono essere condivisi tra tutte le classi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top