2013-03-09 16 views
5

Ho visto le applicazioni Sitecore pochi campioni che utilizza il codice qui sotto all'interno delle logiche di business:Sitecore - Assert.IsNotNull

Database database = Factory.GetDatabase(itemUri.DatabaseName); 
Assert.IsNotNull(database, itemUri.DatabaseName); 
return database.GetItem(attribute); 

Qualcuno potrebbe chiarire se questa è una convenzione Sitecore. Ho solo usato Assert per scenari di test unitari ma non nella logica.

Grazie.

risposta

5

È una convenzione che può essere vista utilizzata nel sitecore.dll. È usato per generare un'eccezione se tale condizione non viene soddisfatta.

Per esempio, se si guarda al Assert.IsTrue, se la condizione non è soddisfatta, il sistema lanciare una "InvalidOperationException"

De-compilazione del un metodo dal Search API ho trovato questo.

Assert.IsTrue(local_0 != null, "SearchConfiguration is missing"); 

Se poi de-compiliamo IsTrue, ci dà

[AssertionMethod] 
public static void IsTrue([AssertionCondition(AssertionConditionType.IS_TRUE)] bool condition, string message) 
{ 
    if (!condition) 
    throw new InvalidOperationException(message); 
} 

Per rispondere alla tua altra domanda è possibile utilizzare questo nel codice dell'applicazione, come si può vedere il suo solo un altro modo di gettare un eccezione se una condizione non è soddisfatta.

La confusione viene fornita con l'uso della parola assert, che come si è detto si vede solitamente nel contesto dei test unitari in una soluzione tradizionale C# .NET. Finché sai cosa sta facendo il Sitecore dietro le quinte, dipende da te se lo vuoi usare o meno.

8

Ho trovato this article che indirizza la maggior parte della vostra domanda. Ci sono un paio di punti importanti:

  • .NET Assert non è la stessa di Sitecore Assert. Come minimo, Sitecore Assert è molto più dettagliato.
  • È considerata la migliore prassi in Sitecore utilizzare Assert per controllare gli input del metodo. (E troverete questi afferma sempre nel codice di Sitecore e il codice del Sitecorecommunity (io non posso dirvi quanto fastidioso Il campo è nullo può essere.))

penso che sia anche importante notare che molti degli esempi che trovo nei blog di Sitecore sono casi in cui un'eccezione potrebbe comunque verificarsi. Quindi, se si dovesse omettere ArgumentIsNotNull, ad esempio, ciò comporterebbe un NullObjectException, quindi un Assert pulisce effettivamente un po 'le cose. Nel tuo caso, se il Database non è disponibile, ciò potrebbe anche causare un problema. Un Assert lo fa in modo che la causa dell'errore sia chiara.

+3

Vale la pena sottolineare che 'System.Diagnostics.Debug.Assert' è condizionale e verrà attivato solo nei build DEBUG di un'applicazione. Sitecore.Assert non ha restrizioni di questo tipo, pertanto genererà InvalidOperationException ogni volta che la condizione di test fallisce in entrambe le build di DEBUG e RELEASE. –

+0

Puoi chiarire "Assert pulisce le cose un po '". Significa che l'eccezione è gonfia. Ancora non vedo il motivo per cui ne abbiamo bisogno. –

+0

Come dice Kevin, non si vuole fare affidamento solo sugli asser. Assert ha lo scopo di coprire i casi che possono aiutare durante il test, come una risorsa non presente o un valore null che non dovrebbe essere presente. È comunque necessario utilizzare la convalida, le eccezioni e la gestione delle eccezioni per il codice di produzione poiché gli asserzioni non funzionano in una build di rilascio. Sono utili durante i test poiché sono rapidi da aggiungere e possono fornire più feedback con poco sforzo. –