伪造非静态类的静态方法

时间:2019-10-21 12:13:39

标签: c# microsoft-fakes shim

我有一个带有静态方法的非静态类,希望将其填充。

public class MyClass
{
    static MyClass()
    {
        //do constructor things
    }
    public static void MyMethod(string str)
    {
        //do something
    }
}

从我要测试的代码的某些部分( MyClass.MyMethod(“ some string”))调用了此静态方法,但是我对MyMethod的行为不感兴趣。我需要补齐 我的尝试是:

MyClassNamespace.Fakes.ShimMyClass.MyMethod = ("some string") => {};

但是MyMethod丢失了,我相信是因为类不是静态的。

我如何像静态类一样对它进行匀场处理? 我已经读过,可以对Contructor进行填充并模拟一些方法,也许这是一个更好的选择,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

您需要在AllInstances上定义垫片

MyClassNamespace.Fakes.ShimMyClass.AllInstances.MyMethodString = ("some string") => {};

如果您在上面的代码中注意到生成的填充程序中方法的名称带有参数类型(这就是生成Shims的方式)。

答案 1 :(得分:0)

我不确定您的意思是100%,但您似乎想存储静态动作。

在我的示例中,您为静态字段分配了一个lambda表达式。实例可以调用此操作:

public class MyClass
{
    public static Action<string> LogMehod;

    public void Log(string s)
    {
        // call the static log method if it is assigned.
        if(LogMehod != null)
            LogMehod(User + ": " + s);
    }
    public string User {get;set;}
}

class Program
{
    static Main()
    {
        // assign an lambda expression, which displays the passed string.
        MyClass.LogMehod = s =>
        {
            Console.WriteLine(s);
        }

        // create an instance of MyClass
        var user1 = new MyClass();
        user1.User = "User1";
        user1.Log("bla");

        var user2 = new MyClass();
        user2.User = "User2";
        user2.Log("also bla");

        Console.ReadLine();
    }
}

礼物:

User1: bla
User2: also bla