2012-05-25 18 views
6

Stavo scrivendo alcuni test unitari per una libreria di utilità quando mi sono imbattuto in un test che mi sarei aspettato di fallire effettivamente. Il problema è relativo al confronto di due variabili float, rispetto al confronto di una variabile float? e una variabile float.Si tratta di un bug quando si confronta un tipo nullable con il suo tipo sottostante utilizzando FluentAssertions?

sto utilizzando le ultime versioni di entrambi NUnit (2.6.0.12051) e FluentAssertions (1.7.1), e al di sotto è un piccolo codice tagliò che illustra il problema:

using FluentAssertions; 
using FluentAssertions.Assertions; 
using NUnit.Framework; 

namespace CommonUtilities.UnitTests 
{ 
    [TestFixture] 
    public class FluentAssertionsFloatAssertionTest 
    { 
     [Test] 
     public void TestFloatEquality() 
     { 
      float expected = 3.14f; 
      float notExpected = 1.0f; 
      float actual = 3.14f; 

      actual.Should().BeApproximately(expected, 0.1f); 
      actual.Should().BeApproximately(notExpected, 0.1f); // A: Correctly fails (Expected value 3,14 to approximate 1 +/- 0,1, but it differed by 2,14.) 
      actual.Should().BeInRange(expected, expected); 
      actual.Should().BeInRange(notExpected, notExpected); // B: Correctly fails (Expected value 3,14 to be between 1 and 1, but it was not.) 
     } 

     [Test] 
     public void TestNullableFloatEquality() 
     { 
      float expected = 3.14f; 
      float notExpected = 1.0f; 
      float? actual = 3.14f; 

      actual.Should().BeApproximately(expected, 0.1f); 
      actual.Should().BeApproximately(notExpected, 0.1f); // C: Passes (I expected it to fail!) 
      actual.Should().BeInRange(expected, expected); 
      actual.Should().BeInRange(notExpected, notExpected); // D: Correctly fails (Expected value 3,14 to be between 1 and 1, but it was not.) 
     } 
    } 
} 

Come si può vedere da i miei commenti, in TestFloatEquality() sia A e B non funzionano correttamente (è sufficiente commentare il primo test non riuscito per arrivare al secondo).

In TestNullableFloatEquality() tuttavia, D passaggi ma C fallisce. Mi sarei aspettato che lo C fallisse anche qui. E solo per aver parlato, se aggiungo asserzioni utilizzando NUnit:

Assert.AreEqual(expected, actual); // Passes 
Assert.AreEqual(notExpected, actual); // Fails (Expected: 1.0f But was: 3.1400001f) 

quelli pass e fallire come previsto.

Quindi, alla domanda: si tratta di un bug in FluentAssertions o mi manca qualcosa rispetto al confronto nullable?

risposta

4

È stato un errore. Ho risolto questo problema sia nel ramo di release 1.7.x che nel trunk. Lo sviluppo sul nuovo 2.0.0 è ancora in corso, quindi potremmo decidere di fare una versione 1.7.2 dopo tutto.

Vedere http://fluentassertions.codeplex.com/workitem/12199 per lo stato esatto.

+0

È nella versione beta 2.0 all'indirizzo http://fluentassertions.codeplex.com/releases/view/82423 –