2010-06-04 7 views
21

Ho un tale insieme di Costruttori:Usa Moq per simulare Constructor?

public BusinessObjectContext() 
     : this(CloudStorageAccount.FromConfigurationSetting("DataConnectionString").TableEndpoint.ToString(), 
       CloudStorageAccount.FromConfigurationSetting("DataConnectionString").Credentials) {} 

public BusinessObjectContext(string dataConnectionString) 
     : this(CloudStorageAccount.Parse(dataConnectionString).TableEndpoint.ToString(), 
       CloudStorageAccount.Parse(dataConnectionString).Credentials) { } 

public BusinessObjectContext(String baseAddress, StorageCredentials credentials) 
     : base(baseAddress, credentials) { } 

Tuttavia quando test/Mocking devo dell'oggetto senza uno dei parametri della stringa di connessione. Come posso fare questo - preferibilmente in Moq?

È possibile?

risposta

17

Sembra che si abbia un odore di codice: lo constructor is doing too much work. L'articolo include una serie di correzioni per tali scenari. Fondamentalmente la risposta è solo eseguire l'assegnazione nei costruttori, non eseguire la business logic.

+0

Hrrm. Vedo l'argomento in questo concetto. D'altro canto volevo proteggere l'utente dell'oggetto GenericBusinessObject dal pensare al contesto dell'origine dati. Se seguo i tuoi argomenti, l'utente di GenericBusinessObject deve pensarci. Questa è meno l'astrazione. Forse non c'è altro modo, ma qualcosa mi fa esitare. –

+1

Fabbrica una fabbrica o utilizza un Conatainer IOC per rimuovere questa necessità che l'utente si preoccupi del contesto dati. – Finglas

26
var myMockBOC = new Mock<BusinessObjectContext>(null, null); 

Questo passerà i valori nulli per i due parametri.

Un altro approccio potrebbe essere quello di creare un costruttore interno destinato esclusivamente all'uso di test e utilizzare InternalsVisibleTo per consentire al gruppo di test di utilizzarlo. Sfortunatamente questo ha un grosso inconveniente nel fatto che se si firmano i propri assembly, Moq is unable to use the constructor. Questo dovrebbe essere affrontato nella versione 4.0 di Moq però.

+6

Lo svantaggio di un costruttore interno è che ora si sta scrivendo il codice per supportare i test dell'unità. –

+2

Direi che è accettabile quando c'è un requisito intenzionale che l'API * public * non sia iniettabile. L'unica volta che presenterebbe i problemi sarebbe se i tuoi costruttori non fossero semplicistici e contenessero la logica di business - quindi, come si suol dire, avresti due problemi ... – womp

+0

Soluzione molto semplice! Mi ha aiutato molto! –