C# 如何模拟私有静态内部类?

C# 如何模拟私有静态内部类?,c#,justmock,C#,Justmock,我想问一个非常困扰我的问题 如何模拟MyPublicStaticMethod_C的返回值MyPrivateStaticClass_B确实是私有的和静态的 public static partial class MyPublicStaticClass_A { private static partial class MyPrivateStaticClass_B { public static int MyPublicStaticMethod_C(string par

我想问一个非常困扰我的问题

如何模拟MyPublicStaticMethod_C的返回值MyPrivateStaticClass_B确实是私有的静态的

public static partial class MyPublicStaticClass_A
{
    private static partial class MyPrivateStaticClass_B
    {
        public static int MyPublicStaticMethod_C(string para)
        {
            //...
        }
        //...
    }
}

我要说的是,你不应该嘲笑这一点。 编写测试时,应该只测试公共接口,而不是私有接口。私有内容是特定于实现的,您的测试不应该关心这一点

如果您有一个调用私有方法的公共方法,并且您觉得需要模拟私有方法才能正确地测试您的类,那么这就是代码的味道。您应该重构代码,并将内部私有类作为接口,这样您就可以模拟它


如果你真的想办法在当前状态下模拟它,它很可能不会真正为你提供一个更好的测试系统——但是它会让你进行难以维护的脆弱测试。

我在这里会稍微帮不上忙,并说你不应该模拟它。 编写测试时,应该只测试公共接口,而不是私有接口。私有内容是特定于实现的,您的测试不应该关心这一点

如果您有一个调用私有方法的公共方法,并且您觉得需要模拟私有方法才能正确地测试您的类,那么这就是代码的味道。您应该重构代码,并将内部私有类作为接口,这样您就可以模拟它


如果您确实想办法在当前状态下模拟它,它很可能不会真正为您提供一个更好的测试系统-但是它会让您获得难以维护的脆弱测试。

您必须使用
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);
    }
public静态部分类MyPublicStaticClass\u A
{
公共静态int测试(字符串str)
{
返回MyPrivateStaticClass_B.MyPublicStaticMethod_C(str);
}
私有静态部分类MyPrivateStaticClass_B
{
公共静态int MyPublicStaticMethod_C(字符串段落)
{
返回1;
}
}
}
[测试方法]
public void应安排InnerPrivateClassMethod()
{
var privateType=typeof(MyPublicStaticClass_A).GetNestedType(“MyPrivateStaticClass_B”,BindingFlags.NonPublic);
Mock.NonPublic.Arrange(privateType,“MyPublicStaticMethod_C”)。返回(5);
var结果=MyPublicStaticClass_A.测试(空);
断言。相等(5,结果);
}

但是,是的,只有在重构不可能或不可行的情况下,拥有这样的代码才应该是最后的选择。

您必须使用
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);
    }
public静态部分类MyPublicStaticClass\u A
{
公共静态int测试(字符串str)
{
返回MyPrivateStaticClass_B.MyPublicStaticMethod_C(str);
}
私有静态部分类MyPrivateStaticClass_B
{
公共静态int MyPublicStaticMethod_C(字符串段落)
{
返回1;
}
}
}
[测试方法]
public void应安排InnerPrivateClassMethod()
{
var privateType=typeof(MyPublicStaticClass_A).GetNestedType(“MyPrivateStaticClass_B”,BindingFlags.NonPublic);
Mock.NonPublic.Arrange(privateType,“MyPublicStaticMethod_C”)。返回(5);
var结果=MyPublicStaticClass_A.测试(空);
断言。相等(5,结果);
}

但是,是的,只有在重构不可能或不可行的情况下,拥有这样的代码才应该是最后的选择。

非常感谢!这很有帮助,但它基于公司的一个架构,我无法更改它…非常感谢!这很有帮助,但它基于公司的一个架构,我无法更改它。。。