Как проверить, возвращает ли функция IEnumerable <Integer> - PullRequest
3 голосов
/ 18 декабря 2010

Я пытаюсь проверить функцию

public static IEnumerable<Integer> Divisors(Integer n)
{
    int max = (int)System.Math.Sqrt(n);

    if (n != 0)
        yield return 1;

    for (int i = 2; i <= max; i++)
        if (n % i == 0)
            yield return i;
}

и мне нужно написать тестовую функцию типа

[Test]
public void DivisorsTest()
{   
    Integer n = 0; 
    IEnumerable<Integer> expected = 0 ; //error
    IEnumerable<Integer> actual;
    actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
    Assert.AreEqual(expected, actual);
}

Как мне изменить эту строку, чтобы проверить вывод, который мне нужен, чтобы проверить возвращаемые значения, которые не являются просто нулем

Ответы [ 5 ]

2 голосов
/ 18 декабря 2010

Существуют различные приемы проверки всей коллекции.Похоже, для ввода нуля, вы не хотите, чтобы какие-либо значения возвращались (т.е. пустой набор), поэтому вы можете сделать это:

Assert.IsFalse(actual.Any()); // There should not be any elements returned

Для более сложных выходных данных, это часто прощепоместить результат в массив и проверить результаты по индексу следующим образом:

var results = actual.ToArray();
Assert.AreEqual(5, results.Count);
Assert.AreEqual(1, results[0]);
Assert.AreEqual(2, results[1]);
// etc.
0 голосов
/ 28 декабря 2010

ОК, спасибо всем за ваши ответы, и вот что я сделал, используя ваши ответы

функции теста будут: 1 - когда вы ожидаете, что функция не вернет никакого значения

[Test]
   public void DivisorsTest_01()
   {   
       Integer n = 0; 
       IEnumerable<Integer> actual;
       actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
       Assert.IsFalse(actual.Any()); // There should not be any elements returned so empty
   }

2 - все, что вам нужно, это преобразовать o / p в массив и использовать его:

[Test]
   public void DivisorsTest_03()
   {
       Integer n = 9;
       Integer[] expected = new Integer[3] { 1,3,9 };
       IEnumerable<Integer> actual;
       actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
       var actual1 = actual.ToArray();

       Assert.AreEqual(expected[0], actual1[0]);
       Assert.AreEqual(expected[1], actual1[1]);
       Assert.AreEqual(expected[2], actual1[2]);

   }

3 - иногда вы ожидаете, что вывод будет исключением, поэтому не забывайте писать:

[Test]
[ExpectedException]

перед функцией.

Еще раз спасибо всем

0 голосов
/ 18 декабря 2010

Я часто использую что-то подобное:

var expected = new int[] { /* expected values */ };
var actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
Assert.IsTrue(expected.SequenceEquals(actual));

Недостатком является то, что сообщение об ошибке подтверждения по умолчанию не очень наглядно:

Expected: True
But was: False

Вместо этого вы можете использовать CollectionAssert.AreEquivalent, которое выдает более подробное сообщение об ошибке, но оно также не идеально ... Если вы используете запрос Linq, сообщение может выглядеть так:

Expected: equivalent to < 0, 1, 3, 4, 6, 7, 9, 10 >
But was:  <System.Linq.Enumerable+<WhereIterator>d__0`1[System.Int32]>

(по крайней мере, с NUnit 2.4.8,возможно, мне стоит перейти на более новую версию ...)

0 голосов
/ 18 декабря 2010

Вы также можете инициализировать ожидаемый пустой перечисляемый объект (т. Е. Ноль элементов), например

IEnumerable<int> expected = System.Linq.Enumerable.Empty<int>();

Ссылка MSDN для Enumerable

0 голосов
/ 18 декабря 2010

Не могли бы вы использовать что-то подобное (извините, для этого нужен Linq):

[Test]
public void DivisorsTest()
{   
    int n = 0; 
    int expected = 0; //error
    IEnumerable<Integer> actual;
    actual = Science.Mathematics.NumberTheoryFunctions.Divisors(n);
    Assert.IsTrue(actual.All(x => x != expected));
}
...