Я писал несколько модульных тестов для служебной библиотеки, когда наткнулся на тест, который, как я ожидал, провалится, но который на самом деле прошел.Проблема связана со сравнением двух переменных float
и сравнения одной переменной float?
и одной переменной float
.
Я использую последние версии NUnit (2.6.0.12051) и FluentAssertions (1.7.1), и ниже приведен небольшой фрагмент кода, иллюстрирующий проблему:
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.)
}
}
}
Как вы можете видеть из моих комментариев, в TestFloatEquality()
оба Aи Bзавершаются правильно (просто закомментируйте первый неудачный тест, чтобы перейти ко второму).
Однако в TestNullableFloatEquality()
Dпроходит успешно, а Cне проходит. Я ожидал, что Cи здесь потерпит неудачу. И просто упомянул об этом, если я добавлю утверждения с помощью NUnit:
Assert.AreEqual(expected, actual); // Passes
Assert.AreEqual(notExpected, actual); // Fails (Expected: 1.0f But was: 3.1400001f)
они проходят и терпят неудачу, как и ожидалось.
Итак, на вопрос: это ошибка в FluentAssertions, или я что-то упустил в отношении сравнения с нулевым значением?