【问题标题】:Fake a static method of a non-static class伪造非静态类的静态方法
【发布时间】:2020-02-17 12:43:46
【问题描述】:

我有一个带有静态方法的非静态类,我想填充它。

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 丢失了,我相信是因为该类不是静态的。

我怎样才能像静态类一样填充它? 我已经读过可以填充构造器并模拟一些方法,也许这是一个更好的选择,但我不知道该怎么做。

【问题讨论】:

  • 您的意思是公共静态字段或属性,例如:public static Action<string> MyMethod = s => {};
  • 对不起,我不明白。你能更清楚地向我解释一下吗?你的意思是我需要实现一个调用方法的属性?
  • U,您需要像公共变量这样的东西,您可以在其中存储自定义方法/操作。我不确定你是不是这个意思。

标签: c# microsoft-fakes shim


【解决方案1】:

您需要在AllInstances 上定义 Shim

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

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

【讨论】:

  • 我明白了,但是我找不到AllInstances之后的方法,有或没有参数类型...实际上我看不到任何方法,只有EqualsReferenceEquals
  • 是否为您的班级/程序集正确生成了假货?您能看到 Shim/Stub 已生成吗?
【解决方案2】:

我不确定 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多