我想问一个让我很烦的问题......
如何模拟 MyPublicStaticMethod_C 的返回值? MyPrivateStaticClass_B 实际上是私有和静态
public static partial class MyPublicStaticClass_A
{
private static partial class MyPrivateStaticClass_B
{
public static int MyPublicStaticMethod_C(string para)
{
//...
}
//...
}
}
答案 0 :(得分:5)
我会在这里稍微无益,并说你不应该嘲笑那个。 编写测试时,您应该只测试您的公共接口,而不是私有。私有内容是特定于实现的,您的测试不应该关心它。
如果您有一个调用私有方法的公共方法,并且您认为需要模拟私有方法才能正确测试您的类 - 这就是代码味道。你应该重构你的代码并将内部私有类作为接口,这样你就可以模拟它。
如果你确实找到了一种在当前状态下模拟它的方法,它很可能不会给你一个更好的测试系统 - 但它会让你得到难以维护的脆弱测试。
答案 1 :(得分:1)
您必须使用GetNestedType()
通过反射API引用私有类型。然后,您可以使用非公共模拟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);
}
但是,是的,拥有这样的代码应该是最后的手段 - 只有重构是不可能的或不可行的。