5

假设我们有一个看起来像这样的方法:

public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
    if(subjects == null)
        throw new ArgumentNullException("subjects");

    foreach(var puppy in puppies)
        yield return puppy.Grow();
}

如果我这样做测试:

Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll());

测试将失败,说它

预期:<System.ArgumentNullException>
但是是: null

我可以通过将测试更改为

Puppy[] puppies = null;
Assert.Throws<ArgumentNullException>(() => puppies.GrowAll().ToArray());

这就是你通常的做法吗?或者有没有更好的方法来编写测试?或者也许是编写方法本身的更好方法?


尝试对内置Select方法做同样的事情,即使没有 aToArray或类似的东西它也失败了,所以显然你可以做些什么......我只是不知道是什么:p

4

1 回答 1

3

测试很好 - 你的代码不是。您应该通过将方法分成两半来使代码在调用时立即抛出异常:

public IEnumerable<Dog> GrowAll(this IEnumerable<Puppy> puppies)
{
    if(subjects == null)
        throw new ArgumentNullException("subjects");

    return GrowAllImpl(puppies);
}

private IEnumerable<Dog> GrowAllImpl(this IEnumerable<Puppy> puppies)
{
    foreach(var puppy in puppies)
        yield return puppy.Grow();
}
于 2010-01-11T13:16:43.983 回答