Questa non è una domanda molto generica, quindi potrebbe non essere esattamente appropriata qui, ma potrei sicuramente usare un suggerimento se ne hai uno:
Ho un oggetto contenente un dizionario digitato da un enum, qualcosa del genere:
namespace Application
{
public enum Material { H20, CO2, Na }
public class Container
{
private Dictionary<Material, ChemicalComponent> dic;
public Container(Dictionary<Material, ChemicalComponent> d)
{
dic = d;
}
}
}
Ora voglio creare un MockContainer e un MockMaterial, ma non riesco a capire come far funzionare tutto insieme. Il seguente codice, ad esempio, non funziona (vedi commento):
using Application;
namespace UnitTesting
{
public enum mockMaterial { mock1, mock2, mock3 }
public class mockContainer : Container
{
public mockContainer(Dictionary<mockMaterial, ChemicalComponent> d)
: base(d) // compiler error: the base constructor "has some invalid arguments"
{
}
}
}
Inizialmente avevo sperato di estendere l'enum materiale all'interno dello spazio dei nomi di UnitTesting; quindi potrei semplicemente usare il dizionario del contenitore, ma con chiavi diverse. Ma ovviamente non è legale in C #. C'è un modo non-kludgy per sovraccaricare o iniettare un dizionario con le chiavi di enum finto?
Aggiornamento: Un'opzione è di cambiare la definizione del dizionario in questo modo:
private Dictionary<Enum, ChemicalComponent> dic;
(ad esempio, cambia il tipo di chiave in Enum
in tutto il codice). Questo funziona (ad esempio, elimina l'errore del compilatore), ma questa soluzione sacrifica la chiarezza e la sicurezza del tipo. (Non è più chiaro quale sia il significato della chiave).
Aggiornamento n. 2:
Diverse persone hanno raccomandato di creare un'interfaccia per Container. Ma questo manca il punto. Il contenitore stesso non è poi così complesso. Ma il ChemicalComponents
che è memorizzato in esso è molto complesso. Devo simulare quelli nei miei test di unità, ma non so come farlo senza estendere l'enumerazione che funge da chiave.