NUnit проверяет все значения массива (с допуском) - PullRequest
12 голосов
/ 15 июля 2011

В NUnit я могу сделать следующее:

Assert.That(1.05,Is.EqualTo(1.0).Within(0.1));

Я также могу сделать это:

Assert.That(new[]{1.0,2.0,3.0},Is.EquivalentTo(new[]{3.0,2.0,1.0}));

Теперь я хотел бы сделать что-то вроде этого

Assert.That(new[]{1.05,2.05,3.05},
   Is.EquivalentTo(new[]{3.0,2.0,1.0}).Within(0.1));

За исключением того, что ключевое слово Within не поддерживается в этой ситуации. Есть ли обходной путь или другой подход, который позволил бы сделать это легко?

Ответы [ 3 ]

11 голосов
/ 15 июля 2011

Вы можете установить допуск по умолчанию для плавающих точек:

GlobalSettings.DefaultFloatingPointTolerance = 0.1;
Assert.That(new[] {1.05, 2.05, 3.05}, Is.EquivalentTo(new[] {3.0, 2.0, 1.0}));
7 голосов
/ 15 июля 2011

Вы можете сделать:

var actual = new[] {1.05, 2.05, 3.05};
var expected = new[] { 1, 2, 3 };
Assert.That(actual, Is.EqualTo(expected).Within(0.1));

Однако семантика Is.EqualTo несколько отличается от Is.EquivalentTo - EquivalentTo игнорирует порядок ({1, 2, 3} эквивалентен, но не равен {2, 1, 3}). Если вы хотите сохранить эту семантику, самое простое решение - отсортировать массивы перед утверждением. Если вы собираетесь часто использовать эту конструкцию, я бы предложил написать собственное ограничение для этого.

1 голос
/ 15 июля 2011

Конечно, вы можете использовать EqualTo для проверки значений массива.Как это:

  /// <summary>
  /// Validate the array is within a specified amount
  /// </summary>
  [Test]
  public void ValidateArrayWithinValue()
  {
     var array1 = new double[] { 0.0023d, 0.011d, 0.743d };
     var array2 = new double[] { 0.0033d, 0.012d, 0.742d };

     Assert.That(array1, Is.EqualTo(array2).Within(0.00101d), "Array Failed Constaint!");
  } // ValidateArrayWithinValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...