Come si può facilmente unità di deserializzazione del test per diverse versioni di un oggetto?

0

Sto utilizzando la libreria protobuf-net per la serializzazione / deserializzazione dei messaggi.

A causa della natura distribuita dell'applicazione, alcune applicazioni avranno una versione precedente dell'oggetto che viene utilizzata per serializzare i messaggi. I casi che mi interessano sono

  • aggiunta di nuovi campi all'oggetto messaggio che alcuni utenti (deserializzatori) non avranno

  • rimozione dei campi nell'oggetto messaggio che alcuni utenti (deserializzatori) avranno ancora.

Esempio: una vecchia app ha questa definizione di Foo

class Foo
{
   public int Field1 {get; set;}
}

Una nuova app ha questa definizione di Foo

class Foo
{
   public int Field1 {get; set;}
   public int Field2 {get; set;}
}

Voglio avere un test per verificare che la libreria possa deserializzare un oggetto con campi e campi mancanti di cui non è a conoscenza nel caso in cui dovessi mai cambiare la mia libreria di serializzazione.

C'è un modo semplice per testare questo? C # non consente all'utente di modificare i campi disponibili in un oggetto.

Attualmente devo compilare la mia app per il ricevitore e quindi modificare l'oggetto trasportato per aggiungere un nuovo campo e quindi creare l'app di invio per testarlo.

C'è un modo migliore?

    
posta chollida 19.01.2016 - 16:37
fonte

3 risposte

9

Il test di deserializzazione dovrebbe prendere una stringa come input e provare a produrre un oggetto attuale da esso. Pertanto, tutto ciò che devi fare è ripristinare una copia del tuo progetto in uno stato precedente, salvare una stringa serializzata, tornare alla testa e inserire quella stringa nei dati di test. A meno che non fraintenda la tua domanda, non hai mai bisogno di avere versioni diverse della stessa classe effettivamente compilate nel tuo codice base.

    
risposta data 19.01.2016 - 16:43
fonte
0

Forse un po 'in ritardo, ma risponderò per coloro che hanno trovato questa domanda dalla ricerca. Suggerisco di utilizzare la libreria FluentAssertions che fornisce un modo semplice per verificare se un oggetto è serializzabile utilizzando una delle serializzazioni comuni: Xml, Binary e DataContract:

using FluentAssertions;

theObject.Should().BeXmlSerializable();
theObject.Should().BeBinarySerializable();
theObject.Should().BeDataContractSerializable();

theObject.Should().BeBinarySerializable<MyClass>(
    options => options.Excluding(s => s.SomeNonSerializableProperty));
    
risposta data 18.10.2017 - 07:36
fonte
0

Ogni volta che modifichi il dataformat, salva un elemento con un contenuto standartizzato in una cartella di regressione dataformat insieme a una versione leggibile dall'uomo (cioè xml) come risultato previsto.

quindi hai coppie di file di versione 1.0.dat e version-1.0.dat.xml

Quindi scrivi un test di regressione che esegue il loop su tutti i file nella cartella regressione dataformat.

Lo pseudocodice ha il seguente aspetto:

 foreach(String samplePath in LoadSamplePaths("dataformat-regression-folder\*.dat"))
 {
     MyDataFormat sample = LoadSample(samplePath);
     MyDataFormat expected = LoadFromXml(samplePath + ".xml");
    assertEqual(sample.toXml(), expected.toXml());
 }
    
risposta data 18.10.2017 - 12:55
fonte

Leggi altre domande sui tag