1

我想问一个很困扰我的问题...

如何模拟MyPublicStaticMethod_C的返回值? MyPrivateStaticClass_B是真正私有静态的

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

2 回答 2

5

我会在这里有点无益,并说你不应该嘲笑它。在编写测试时,你应该只测试你的公共接口,而不是你的私有接口。私有的东西是特定于实现的,您的测试不应该关心这一点。

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

如果您确实找到了一种在当前状态下模拟它的方法,那么它很可能不会真正为您提供更好的测试系统 - 但是它会给您带来难以维护的脆弱测试。

于 2015-03-11T09:30:29.700 回答
1

您必须使用 . 通过反射 API 引用私有类型GetNestedType()。然后可以使用非公开的 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);
    }

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

于 2015-03-11T11:13:03.140 回答