C#7如何对本地功能进行单元测试

Ada*_*m T 3 c# unit-testing c#-7.0

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

局部函数在方法中定义,不在其外部

所以鉴于下面的代码示例,是否有任何方法对该square方法进行单元测试?

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

    int square(int z)
    {
        return z * z;
    }
}
Run Code Online (Sandbox Code Playgroud)

xan*_*tos 7

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

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

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

    int valueofBplusX(int x)
    {
        return b + x;
    }
}
Run Code Online (Sandbox Code Playgroud)

翻译成如下:

[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;
}
Run Code Online (Sandbox Code Playgroud)

你看到<>c__DisplayClass0_0它包含b局部变量,并<Foo>g__valueofBplusX0_0作为第二个参数接收a ref C.<>c__DisplayClass0_0 ptr

最重要的是,我将添加Keith Nicholas的引用:是的,不要测试私有方法....单元测试的想法是通过其公共'API'测试单元.