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

标签 c# unit-testing c#-7.0

<分区>

我一直在看一些关于局部函数的文章,其中一句话是这样的:

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;
    }
}

最佳答案

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

很容易在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;
}

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

在此之上,我将添加 Keith Nicholas 的引用: 是的,不要测试私有(private)方法....单元测试的想法是通过其公共(public)“API”测试单元。

关于C# 7 如何对本地函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42715550/

相关文章:

c# - 在 VS2017 中使用元组,构建失败但没有显示错误

c# - 在 C# 中创建元组时编译错误,三元运算符周围没有括号

javascript - SweetAlert 使用@Html.ActionLink 确认提示

delphi - 寻找具有良好单元测试覆盖率的开源Delphi项目

c# - 如何对可以属于多个聚合的 ValueObject 进行建模

c++ - 没有匹配的构造函数来初始化 Mock Factory

perl - 如何测试 'use' *失败*?

c# - VS2017错误调试元组任务

c# - 线程创建

c# - 使用 JSON.net 获取 JToken 的名称/ key