Поддельный статический метод нестатического класса - PullRequest
0 голосов
/ 21 октября 2019

У меня есть нестатический класс со статическим методом, который я хочу изменить.

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

Этот статический метод вызывается из некоторой части кода, который я хочу протестировать ( MyClass.MyMethod ("некоторая строка") ), но меня не интересует поведение MyMethod. Мне нужно подправить это. Моя попытка:

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

Но MyMethod отсутствует, я полагаю, потому что класс не является статическим.

Как я могу подобрать его как статический класс? Я читал, что можно подправить Contructor и смоделировать некоторые методы, и, возможно, это лучший выбор, но я не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Я не уверен на 100%, что вы имеете в виду, но похоже, что вы хотите сохранить статическое действие.

В моем примере вы назначаете лямбда-выражение для статического поля. Экземпляры могут вызывать это действие:

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
0 голосов
/ 21 октября 2019

Вам необходимо определить Shim на AllInstances

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

Если вы заметили в приведенном выше коде, имя метода в сгенерированном shim соответствует типу параметра (именно так генерируются Shims).

...