使用C#进行单元测试的私有静态方法,该方法接受其他私有静态方法作为委托参数

10

我的情况: 我有一个非静态类,其中包含两个私有静态方法:其中一个可以作为委托参数传递给另一个方法:

public class MyClass
{
    ...

    private static string MyMethodToTest(int a, int b, Func<int, int, int> myDelegate)
    {
        return "result is " + myDelegate(a, b);
    }

    private static int MyDelegateMethod(int a, int b)
    {
        return (a + b);
    }
}

我需要做的事情是:使用单元测试来测试私有静态方法MyMethodToTest,并将私有静态方法MyDelegateMethod作为委托参数传递给它。
我可以做的是:我知道如何测试一个私有静态方法,但不知道如何将另一个相同类的私有静态方法作为委托参数传递给此方法。
因此,如果我们假设MyMethodToTest方法根本没有第三个参数,则测试方法如下:
using System;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;

...

[TestMethod]
public void MyTest()
{
    PrivateType privateType = new PrivateType(typeof(MyClass));

    Type[] parameterTypes =
    {
        typeof(int),
        typeof(int)
    };

    object[] parameterValues =
    {
        33,
        22
    };

    string result = (string)privateType.InvokeStatic("MyMethodToTest", parameterTypes, parameterValues);

    Assert.IsTrue(result == "result is 55");
}

我的问题:如何测试一个私有静态方法,并将另一个同类的私有静态方法作为委托参数传递给它?


为什么要用一个测试另一个?如果你总是将MyDelegateMethod传递给MyMethodToTest,那么你应该将该代码移动到MyMethodToTest中。如果不是这样,那么你应该能够使用任何委托进行测试。你可以创建一个Func作为对象,并将其作为参数传递。 - zeacuss
这只是一个简化的图示。实际上,我在这个类中有许多类似于 MyDelegateMethod 的方法。它们非常简单,不需要进行测试。最复杂的部分是 MyMethodToTest 方法,必须进行测试。显然,在测试类中编写 MyDelegateMethod 类似的方法的副本,并将它们作为委托参数传递给 MyMethodToTest 方法是可能的(我没有尝试过),但我想避免重复。 - Jordan
1个回答

22

这是应该如何进行的方法

[TestMethod]
public void MyTest()
{
    PrivateType privateType = new PrivateType(typeof(MyClass));

    var myPrivateDelegateMethod = typeof(MyClass).GetMethod("MyDelegateMethod", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
    var dele = myPrivateDelegateMethod.CreateDelegate(typeof(Func<int, int, int>));
    object[] parameterValues =
    {
        33,22,dele
    };
    string result = (string)privateType.InvokeStatic("MyMethodToTest", parameterValues);
    Assert.IsTrue(result == "result is 55");
}

1
谢谢!它可以工作了!只有一个备注:本地变量 parameterTypes 没有被使用,也不是必需的。 - Jordan
运行良好!谢谢 - abann sunny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接