Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 简单NUnit测试失败,因为未抛出异常(抛出测试外)_C#_Nunit - Fatal编程技术网

C# 简单NUnit测试失败,因为未抛出异常(抛出测试外)

C# 简单NUnit测试失败,因为未抛出异常(抛出测试外),c#,nunit,C#,Nunit,我正在创建一个扩展泛型方法Apply,它做什么并不重要,主要的问题是我不知道如何测试它,像ApplyOnNullFunctionThrow这样的简单测试不能说明没有抛出异常,但是如果我从main运行“手动测试”,它抛出异常 主要问题: class Program { static void Main(string[] args) { foreach (var i in first.Apply(second,f)) Console.WriteLine("{

我正在创建一个扩展泛型方法Apply,它做什么并不重要,主要的问题是我不知道如何测试它,像ApplyOnNullFunctionThrow这样的简单测试不能说明没有抛出异常,但是如果我从main运行“手动测试”,它抛出异常

主要问题:

class Program
{
    static void Main(string[] args)
    {
        foreach (var i in first.Apply(second,f)) Console.WriteLine("{0}", i);
        Console.ReadLine();
    }
}
扩展方法:

public static class Applier
{
    public static IEnumerable<T> Apply<T>(this IEnumerable<T> first, IEnumerable<T> second,Func<T,T,T> f)
    {
        if(f == null ) throw new ArgumentNullException();
        if (null==first || null==second) throw new ArgumentNullException();
        var x=second.GetEnumerator();
        
        foreach (var item in first)
        {
           yield return x.MoveNext() ? f(item, x.Current) : f(item, default);

        }

        while (x.MoveNext())
        {
            yield return f(default, x.Current);
        }
            

    }
}
公共静态类应用程序
{
公共静态IEnumerable应用(此IEnumerable第一,IEnumerable第二,函数f)
{
如果(f==null)抛出新的ArgumentNullException();
如果(null==first | | null==second)抛出新的ArgumentNullException();
var x=second.GetEnumerator();
foreach(第一个变量项)
{
收益率返回x.MoveNext()?f(项目,x.Current):f(项目,默认);
}
while(x.MoveNext())
{
收益率回报率f(默认值,x当前值);
}
}
}
测试:

class ApplierTests
{
    [TestCase(new[]{1,2,3},new[]{10,20,30},null)]
    public void ApplyOnNullFunctionThrow<T>(IEnumerable<T> first, IEnumerable<T> second,Func<T,T,T> f)
    {
        Assert.Throws<ArgumentNullException>(() => first.Apply(second, f));
    }
}
类ApplierTests
{
[TestCase(新[]{1,2,3},新[]{10,20,30},null)]
public void ApplyOnNullFunctionThrow(IEnumerable first,IEnumerable second,Func f)
{
Assert.Throws(()=>first.Apply(second,f));
}
}

在您的
Apply
方法中,您有
yield
关键字,这意味着序列的元素将一次返回一个。因此,当您仅使用
yield
关键字调用该方法时,在后台它什么也不做,只返回一个迭代器(
IEnumerable
),您可以在例如
foreach
中使用该迭代器。这里的底线是,在返回的迭代器上调用
MoveNext
之前,不会执行原始
Apply
方法的代码,因此不会引发异常。要解决此问题,您可能需要一个没有
yield
关键字的包装器:

public static IEnumerable<T> Apply<T>(this IEnumerable<T> first, IEnumerable<T> second,Func<T,T,T> f)
{
    if(f == null ) throw new ArgumentNullException();
    if (null==first || null==second) throw new ArgumentNullException();
    return ApplyInternal(first, second, f);
}

private static IEnumerable<T> ApplyInternal<T>(...) {
    var x=second.GetEnumerator();
    
    foreach (var item in first)
    {
       yield return x.MoveNext() ? f(item, x.Current) : f(item, default);

    }

    while (x.MoveNext())
    {
        yield return f(default, x.Current);
    }
}
公共静态IEnumerable应用(此IEnumerable第一,IEnumerable第二,Func f)
{
如果(f==null)抛出新的ArgumentNullException();
如果(null==first | | null==second)抛出新的ArgumentNullException();
返回应用程序内部(第一、第二、f);
}
私有静态IEnumerable应用程序内部(…){
var x=second.GetEnumerator();
foreach(第一个变量项)
{
收益率返回x.MoveNext()?f(项目,x.Current):f(项目,默认);
}
while(x.MoveNext())
{
收益率回报率f(默认值,x当前值);
}
}
除了创建私有方法之外,还可以将其用作替代方法


另请参见,在调用
Main
中的方法时会引发异常,因为您在
foreach
语句中使用了该方法的结果,该语句被编译为对
MoveNext
的重复调用,解释得如此清晰,以至于我已经了解了如何在大学最后一次考试中解决两个不同项目中的一些问题