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 Nicholas:Yes, don't Test private methods....单元测试的思想是测试以其 public 'API'.
为单位
我一直在看一些关于局部函数的文章,一句话说:
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 Nicholas:Yes, don't Test private methods....单元测试的思想是测试以其 public 'API'.
为单位