C# 7 如何对本地函数进行单元测试

C# 7 how to unit test local functions

我一直在看一些关于局部函数的文章,一句话说:

Local functions are defined within a method and aren't available outside of it

那么给出下面的代码示例是否有任何方法可以对 square 方法进行单元测试?

int SumAndSquare(int x, int y)
{
    var sum = x + y;
    return square(sum);

    int square(int z)
    {
        return z * z;
    }
}

一般来说,您无法以可维护的方式处理非平凡的局部函数(原因在 对此回复中进行了解释)。使用定义它的方法的变量的局部函数(所以一个不平凡的函数,不使用局部变量的函数可能是私有方法)有一个包含这些变量的特殊参数。您无法轻松地重新创建此参数 → 您无法调用它。

TryRoslyn中可以很容易地看到(我多么喜欢TryRoslyn!我经常使用它)

int Foo()
{
    int b = 5;
    return valueofBplusX(5);

    int valueofBplusX(int x)
    {
        return b + x;
    }
}

翻译成这样:

[CompilerGenerated]
[StructLayout(LayoutKind.Auto)]
private struct <>c__DisplayClass0_0
{
    public int b;
}

private int Foo()
{
    C.<>c__DisplayClass0_0 <>c__DisplayClass0_ = default(C.<>c__DisplayClass0_0);
    <>c__DisplayClass0_.b = 5;
    return C.<Foo>g__valueofBplusX0_0(5, ref <>c__DisplayClass0_);
}

[CompilerGenerated]
internal static int <Foo>g__valueofBplusX0_0(int x, ref C.<>c__DisplayClass0_0 ptr)
{
    return ptr.b + x;
}

您会看到包含 b 局部变量的 <>c__DisplayClass0_0,以及接收作为第二个参数的 ref C.<>c__DisplayClass0_0 ptr?

<Foo>g__valueofBplusX0_0

在此之上,我将添加引述Keith NicholasYes, don't Test private methods....单元测试的思想是测试以其 public 'API'.

为单位