2012-05-25 23 views
6

Tôi đã viết một số bài kiểm tra đơn vị cho một thư viện tiện ích khi tôi gặp một bài kiểm tra mà tôi mong đợi sẽ không thực sự được chuyển. Vấn đề có liên quan đến việc so sánh hai biến số float so với việc so sánh một biến số float? và một biến số float.Đây có phải là lỗi khi so sánh một loại nullable với loại cơ bản của nó bằng cách sử dụng FluentAssertions không?

Tôi đang sử dụng phiên bản mới nhất của cả hai NUnit (2.6.0.12051) và FluentAssertions (1.7.1), và dưới đây là một mã nhỏ snipped minh họa vấn đề này:

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.) 
     } 
    } 
} 

Như bạn có thể nhìn thấy từ ý kiến ​​của tôi, trong TestFloatEquality() cả hai AB không chính xác (chỉ cần nhận xét ra bài kiểm tra lỗi đầu tiên để chuyển sang bài kiểm tra thứ hai).

Trong TestNullableFloatEquality() tuy nhiên, D vượt qua nhưng C không thành công. Tôi đã mong đợi C cũng không thành công ở đây. Và chỉ để đề cập đến điều đó, nếu tôi thêm xác nhận bằng cách sử dụng NUnit:

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

những lỗi đó và không thành công như mong đợi.

Vì vậy, đối với câu hỏi: Đây có phải là lỗi trong FluentAssertions hay tôi thiếu thứ gì đó liên quan đến so sánh không thể so sánh được?

Trả lời

4

Đó là lỗi. Tôi đã sửa lỗi này trong cả nhánh phát hành 1.7.x cũng như trong thân cây. Phát triển trên 2.0.0 mới vẫn đang tiếp tục, vì vậy chúng tôi có thể quyết định thực hiện bản phát hành 1.7.2 sau tất cả.

Xem http://fluentassertions.codeplex.com/workitem/12199 để biết trạng thái chính xác.

+0

Đó là phiên bản beta 2.0 tại http://fluentassertions.codeplex.com/releases/view/82423 –

Các vấn đề liên quan