我正在尝试测试一个函数
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);
}
如何修改此行以测试输出所需的输出,以测试不仅为零的返回值
答案 0 :(得分:2)
检查整个馆藏有各种技巧。看起来输入为零,你不希望返回任何值(即空集),所以你可以这样做:
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.
答案 1 :(得分:0)
难道你不能使用这样的东西(对不起,它需要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));
}
答案 2 :(得分:0)
您还可以将预期初始化为空的可枚举(即零元素),如此
IEnumerable<int> expected = System.Linq.Enumerable.Empty<int>();
答案 3 :(得分:0)
我经常使用类似的东西:
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中,也许我应该升级到更新版本......)
答案 4 :(得分:0)
好的,谢谢大家的回答,这就是我用你的答案做的事情
测试功能将是: 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]
在功能之前。
再次感谢大家