2012-03-23 12 views
6

Non voglio disabilitare completamente gli avvisi, solo quando è in un'istruzione Assert.Un modo per ignorare i possibili avvisi di eccezione di riferimento null quando si usano le istruzioni di Assert?

Così, per esempio se ho le seguenti due righe

var someObject = GetObject(); 
Assert.IsNotNull(someObject, "someObject should not be null"); 
Assert.AreEqual(expectedValue, someObject.SomeProperty); 

Prendo la possibile avvertimento riferimento null sulla seconda riga sul someObject.SomeProperty. È possibile disattivare l'avviso quando si trova all'interno di una determinata chiamata, ad esempio Assert.AreEqual?

Poiché questo è un problema con molti test di unità, non voglio sporcare i test con il codice di disabilitazione ReSharper.

In questo momento l'unica opzione mi viene in mente è quello di cambiare ogni Assert.IsNotNull chiamata ad essere

var someObject = GetObject(); 
if(someObject == null) 
{ 
    Assert.Fail("someObject is null"); 
    return; 
} 

Anche se questo tipo di sembra sconfiggere lo scopo di avere Assert.IsNotNull in primo luogo. Mi chiedo solo se c'è un modo migliore.

+0

correlati: http://stackoverflow.com/questions/4393456/resharper-how-to-remove-possible-system-nullreferenceexception-warning – JYelton

+0

Can voi pubblicare un esempio più completo? Non posso riprodurre questo; quando si utilizza la libreria di asserzione di NUnit, l'aggiunta di Assert.IsNotNull rimuove l'avviso - e se è in un test o meno non ha alcun effetto. –

+0

@JamesWorld, sto usando MBUnit, non sono sicuro che questo faccia la differenza. Il codice che ho postato fornisce l'avviso usando MBUnit 2.4.2 e ReSharper 6.1.So che non importa se è in un test o no, ma mi interessa solo disabilitarlo nelle classi di test. Dovunque dovrebbe essere abilitato altrove. – Brandon

risposta

0

Se non sbaglio, il tuo problema è che il programma di ricerca dà avvertimenti quando null non è controllato per un oggetto. È possibile modificare le regole del resharper per non dare avvisi nulli nelle classi di test. Here è un collegamento relativo alla modifica dello stile di denominazione ReSharper per i metodi di prova.

+0

Sai che programmi troppo quando inizi a scrivere per ciascuno come una parola. :) Potresti fornire i passaggi su come farlo? Come posso dire a Resharper cosa considerare una classe di test? – Brandon

+0

@Brandon mi hai fatto sorridere :) per favore dai un'occhiata; http://atombrenner.blogspot.com/2010/07/how-to-change-resharper-naming-style.html – daryal

+0

-1 Penso che ti sbagli. L'aspetto dell'avviso non è specifico per le classi di test. –

0

Utilizzare NUnit anziché MBUnit. L'implementazione di NUnit di Assert.IsNotNull() viene prelevata come garanzia non nulla mentre MBUnit's no.

+0

Naturalmente questo probabilmente non è molto pratico nel tuo caso. –

+1

Come garantire per Assert.That (risultato, Is.Not.Null)? – labilbe

1

non so biblioteca specifica che si utilizza, ma mi piacerebbe provare qualcosa di simile

Assert.IsTrue(someObject != null); 

o, per ragioni di completezza,

Assert.IsNotNull(someObject, "someObject must not be null"); 
Assert.IsNotNull(someObject.SomeProperty, "SomeProperty must not be null either"); 
Assert.SomethingElse(...); 
+0

Grazie per la risposta, ma il problema continuerà a esistere. Anche se asserisco l'oggetto e la proprietà non è nulla, gli avvertimenti non si preoccupano e danno comunque l'avvertimento. Gli avvertimenti spariranno solo se eseguirò un 'object == null' e tornerò fuori dal metodo. – Brandon

+0

@Brandon Per curiosità, nonostante gli avvertimenti, i test passano e falliscono come ci si aspetterebbe? – Alex

+0

si. Questo è più di un problema nitpicky. Semplicemente non mi piace che le ampie ispezioni della soluzione vengano riempite con un sacco di avvertenze che in realtà non dovrebbero essere avvertimenti. Ciò non influisce sul codice effettivo o sul test o altro. – Brandon

1

aggiungere questo al vostro progetto:

public static class AssertionsExtensions 
{ 
    [NotNull] 
    public static TSubject ShouldNotBeNull<TSubject>([CanBeNull] this TSubject source, 
     [CanBeNull] string because = "", [CanBeNull] [ItemCanBeNull] params object[] reasonArgs) 
    { 
     source.Should().NotBeNull(because, reasonArgs); 

     // ReSharper disable once AssignNullToNotNullAttribute 
     return source; 
    } 
} 

poi usarlo in questo modo, per esempio:

  // Assert 
      succeeded.Should().Be(true, "<USB loopback cable must be connected and COM port must be correct.>"); 
      DeviceStatus deviceStatusNotNull = testRunner.Result.ShouldNotBeNull(); 
      deviceStatusNotNull.DeviceAddress.Should().Be(deviceAddress); 
      deviceStatusNotNull.IsInNetwork.Should().Be(true); 
0

È possibile utilizzare ContractAnnotations per indicare l'esecuzione si ferma se il parametro è nullo. Vedi jetbrains contract annotations. Classe del campione:

public static class FluentExtensions 
{ 
     //see: https://www.jetbrains.com/help/resharper/2017.3/Contract_Annotations.html 
     [ContractAnnotation("null => stop")] 
     public static void ShouldNotBeNull(this object objToTest) 
     { 
      objToTest.Should().NotBeNull(); 
     } 

} 

Usage:

doc.ShouldNotBeNull(); 
doc.Content.ShouldNotBeNull();