如何模拟私有静态内部 class?
How to mock a private static inner class?
我想问一个很困扰我的问题...
如何模拟 MyPublicStaticMethod_C 的 return 值? MyPrivateStaticClass_B 确实是 private 和 static
public static partial class MyPublicStaticClass_A
{
private static partial class MyPrivateStaticClass_B
{
public static int MyPublicStaticMethod_C(string para)
{
//...
}
//...
}
}
我在这里有点帮不上忙,你不应该嘲笑那个。
编写测试时,你应该只测试你的 public 接口,而不是你的私有接口。私有内容是特定于实现的,您的测试不应该关心它。
如果您有一个调用私有方法的 public 方法,并且您觉得需要模拟私有方法才能正确测试您的 class - 这就是代码味道。您应该重构您的代码并将内部私有 class 作为接口,这样您就可以模拟它。
如果您确实找到了一种在当前状态下对其进行模拟的方法,它很可能不会真正为您提供经过更好测试的系统 - 但是它会给您带来难以维护的脆弱测试。
您必须使用 GetNestedType()
通过反射 API 引用私有类型。然后你可以使用非public mocking API 来安排方法。这是一个工作示例:
public static partial class MyPublicStaticClass_A
{
public static int Test(string str)
{
return MyPrivateStaticClass_B.MyPublicStaticMethod_C(str);
}
private static partial class MyPrivateStaticClass_B
{
public static int MyPublicStaticMethod_C(string para)
{
return 1;
}
}
}
[TestMethod]
public void ShouldArrangeInnerPrivateClassMethod()
{
var privateType = typeof(MyPublicStaticClass_A).GetNestedType("MyPrivateStaticClass_B", BindingFlags.NonPublic);
Mock.NonPublic.Arrange<int>(privateType, "MyPublicStaticMethod_C").Returns(5);
var result = MyPublicStaticClass_A.Test(null);
Assert.Equal(5, result);
}
但是,是的,拥有这样的代码应该是最后的手段——只有在重构不可能或不可行的情况下。
我想问一个很困扰我的问题...
如何模拟 MyPublicStaticMethod_C 的 return 值? MyPrivateStaticClass_B 确实是 private 和 static
public static partial class MyPublicStaticClass_A
{
private static partial class MyPrivateStaticClass_B
{
public static int MyPublicStaticMethod_C(string para)
{
//...
}
//...
}
}
我在这里有点帮不上忙,你不应该嘲笑那个。 编写测试时,你应该只测试你的 public 接口,而不是你的私有接口。私有内容是特定于实现的,您的测试不应该关心它。
如果您有一个调用私有方法的 public 方法,并且您觉得需要模拟私有方法才能正确测试您的 class - 这就是代码味道。您应该重构您的代码并将内部私有 class 作为接口,这样您就可以模拟它。
如果您确实找到了一种在当前状态下对其进行模拟的方法,它很可能不会真正为您提供经过更好测试的系统 - 但是它会给您带来难以维护的脆弱测试。
您必须使用 GetNestedType()
通过反射 API 引用私有类型。然后你可以使用非public mocking API 来安排方法。这是一个工作示例:
public static partial class MyPublicStaticClass_A
{
public static int Test(string str)
{
return MyPrivateStaticClass_B.MyPublicStaticMethod_C(str);
}
private static partial class MyPrivateStaticClass_B
{
public static int MyPublicStaticMethod_C(string para)
{
return 1;
}
}
}
[TestMethod]
public void ShouldArrangeInnerPrivateClassMethod()
{
var privateType = typeof(MyPublicStaticClass_A).GetNestedType("MyPrivateStaticClass_B", BindingFlags.NonPublic);
Mock.NonPublic.Arrange<int>(privateType, "MyPublicStaticMethod_C").Returns(5);
var result = MyPublicStaticClass_A.Test(null);
Assert.Equal(5, result);
}
但是,是的,拥有这样的代码应该是最后的手段——只有在重构不可能或不可行的情况下。