【问题标题】:C# 7 how to unit test local functions [duplicate]C#7如何对本地函数进行单元测试[重复]
【发布时间】:2017-03-10 10:03:15
【问题描述】:

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

局部函数在方法内定义,在方法外不可用

那么鉴于下面的代码示例,有没有办法对square 方法进行单元测试?

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

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

【问题讨论】:

  • 通过单元测试SumAndSquare。这就是单位(或者在这种情况下不是,因为它是私有的,但如果它是公共的,它就会是)。
  • 以同样的方式对私有方法进行单元测试:你没有。您对课程的公共部分进行单元测试。
  • @AdamT 但是我支持Keith Nicholas 接受的回应:是的,不要测试私有方法.... 单元测试的想法是通过它的公共来测试单元'API'。 .我并不是说不可能执行私有方法......我甚至在早上使用反射来加热牛奶:-)
  • 检查副本,即使它是关于 F# 的。 F# 从一开始就支持嵌套函数。它们非常有用,但不能替代私有方法。例如,如果嵌套函数仅由其父函数使用,为什么需要单独测试它?如果它太复杂以至于需要测试,那你可能做错了
  • 我没有看到 F# 问题是有效的重复。

标签: c# unit-testing c#-7.0


【解决方案1】:

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

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 局部变量的&lt;&gt;c__DisplayClass0_0,以及接收ref C.&lt;&gt;c__DisplayClass0_0 ptr 作为第二个参数的&lt;Foo&gt;g__valueofBplusX0_0

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

【讨论】:

  • 我不是说你应该这样做,但你仍然可以做到这一点,方法是使用反射构造一个显示类的实例。
  • @caesay 它不可维护(我在等待这个问题?)...函数的局部变量的名称不是其“外部接口”的一部分...它们可以根据程序员的心血来潮进行更改/重构,这将破坏您的单元测试(因为您的单元测试将在填写 &lt;&gt;c__DisplayClass0_0 时中断)。
  • TryRoslyn 可以很好地洞察实际发生的事情,我可以看到在本地方法上维护单元测试是多么困难。
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2014-02-08
  • 2016-08-17
  • 2012-12-11
  • 2021-12-03
  • 1970-01-01
  • 2019-04-15
相关资源
最近更新 更多